3

2つのスクリプトscript_aとscript_bがあります。script_aはscript_bを呼び出します。script_bは2つのプロセスをフォークします。以下に示すように。

script_aは、script_bの親と子の両方が終了するのを待ちます。script_bの子プロセスを待たずにscript_aを続行したい。

これに対して私が行ったことはscript_bにあり、次のコードを追加しました。

if (! $f_id) {
    close STDOUT;
    close STDERR;
    exec("sleep 10; echo 'i am child'");
}

これは私のために働きます。script_aは子プロセスを待機しなくなりました。

ここでの私の質問は、1です。これはこれを行う正しい方法ですか?2.親プロセスと子プロセスは同じSTDOUTとSTDERRを共有しますか?競合状態が発生した場合、問題が発生しますか?3.これを行うためのより良い方法はありますか?

助けてくれてありがとう。

script_a.pl

#! /usr/local/bin/perl
print `script_b.pl`;

script_b.pl

#! /usr/local/bin/perl

$f_id = fork();

if (! $f_id) {
    exec("sleep 10; echo 'i am child'");
}

if ($f_id) {
    print "i am parent\n";
}
4

2 に答える 2

1

script_aで``を使用する代わりに。script_aのSTDOUTとSTDERRをリダイレクトしました。何かのようなもの

script_a

system("script_b.pl > /var/tmp/out_file 2>&1");

script_b

#! /usr/local/bin/perl

$f_id = fork();

if (! $f_id) {
    exec("sleep 10; echo 'i am child'");
}

if ($f_id) {
    print "i am parent\n";
}

このように、呼び出し元はexecの子が完了するのを待ちませんでした。

ここで助けてくれてありがとう。

于 2012-05-24T13:33:14.280 に答える
0

`` perlのバックティックは、コマンドが完了するのを待ちます。したがって、親プロセスを待機させたくない場合は、バックグラウンドでシステム(コマンド&)を配置します。

于 2012-05-22T10:19:12.800 に答える