waitpid

特定の子プロセスが終了するのを待つ

構文

解説

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;
}

引数 PID0 または -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 を参照してください。