特定の子プロセスが終了するのを待つ
waitpid
は pid が引数 PID に一致する子プロセスが終了するのを待ちます。
この場合、PID は正の整数でなければいけません。
もし PID に -2 以下の整数を指定すると、その絶対値が適用されます。
該当の子プロセスが終了すると、waitpid
はその子プロセスの pid を返します。
waitpid
は、指定の子プロセスがなければ -1 を返します。
# 子プロセスをフォークする
my $pid = fork();
# 親プロセスと子プロセスの分岐
if ($pid) {
# 親プロセスのコード
print "親プロセス\n";
# 子プロセスが終了するのを待つ
waitpid( $pid, 0 );
}
else {
# 子プロセスのコード
print "子プロセス\n";
exit 0;
}
引数 PID に 0
または -1
を指定すると、特別な意味を持ちます。
0
を指定すると、現在のプロセスと同じグループ ID を持つ子プロセスのうち、最初に終了する子プロセスを待つことになります。
-1
を指定すると、すべての子プロセスのうち、最初に終了する子プロセスを待つことになります。
複数の子プロセスを生成した場合、すべての子プロセスが終了するまで待ちたいところです。 次のサンプルは、そのような状況を想定して、すべての子プロセスの終了を待って、 親プロセスが終了します。
my @pids;
for ( my $i = 0 ; $i < 3 ; $i++ ) {
# 子プロセスをフォークする
$pids[$i] = fork();
# 子プロセスの処理
unless ( $pids[$i] ) {
my $sec = $i + 1;
sleep $sec;
print "子プロセスが ${sec} 秒で処理を終了しました。\n";
exit 0;
}
}
# 子プロセスが終了するのを待つ
for my $pid (@pids) {
waitpid( $pid, 0 );
}
print "すべての子プロセスが終了しました。\n";
引数 FLAGS は通常は指定しない、または、0 を指定します。 詳細については、perldoc を参照してください。