4

私は自分の学習目的でfork()とexec()の概念を理解しようとしています。私はperlforkを2番目の同一のプロセスとして使用し、それを使用して.shスクリプトを実行しようとしています。

fork()とexec()を使用する場合、.shスクリプトをperlスクリプトと並行して実行できますか?Perlスクリプトは子プロセスを待機せず、実行を続行します。したがって、私のperlスクリプトは子プロセスの出力を気にしませんが、コマンドが有効で実行されていることだけを気にします。スクリプトを呼び出してバックグラウンドで実行するようなものです。

子プロセスも正しく終了したことを知るために実装できる何らかの安全性はありますか?

4

2 に答える 2

5

fork() & exec() を使用すると、.sh スクリプトを perl スクリプトと並行して実行できますか? [...] スクリプトを呼び出してバックグラウンドで実行するようなものです。

はい。Fork & exec は、実際にはシェルがバックグラウンドでコマンドを実行する方法です。

子プロセスも正しく終了したことを知るために実装できるある種の安全性はありますか?

はい、waitpid()を使用して、格納されている戻り値を確認します$?

@rohanpm が述べたように、perlipcのman ページには、これを行う方法を示す便利な例がたくさんあります。これは、シグナルハンドラが設定されている最も関連性の高いものの1つですSIGCHLD(子が終了したときに親に送信されます)

use POSIX ":sys_wait_h";
$SIG{CHLD} = sub {
    while ((my $child = waitpid(-1, WNOHANG)) > 0) {
        $Kid_Status{$child} = $?;
    }
};
于 2012-09-25T22:00:01.997 に答える
3

子プロセスを待機しないように waitpid を設定するには:

use POSIX qw/ WNOHANG /;
my $st = waitpid $pid, WNOHANG;

プロセスがまだ実行中の場合は $st は 0 であり、リープされた場合は pid です。

于 2012-09-26T22:12:59.340 に答える