10

SIGCHLDシグナルを送信したプロセスのpidが何であるかを理解しようとしています。これは、SIGCHLD用に作成したシグナルハンドラーで実行したいと思います。どうすればいいですか?私はしようとしています:

int pid = waitpid(-1, NULL, WNOHANG);

スポーンされる子プロセスを待ちたいからです。

4

1 に答える 1

11

waitpid()示されているように多かれ少なかれ使用すると、死んだ子プロセスの1つのPIDが通知されます。通常、死んだプロセスはそれだけですが、それらが急増すると、1つになる可能性があります。信号と収集する多くの死体。したがって、次を使用します。

void sigchld_handler(int signum)
{
    pid_t pid;
    int   status;
    while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
    {
        unregister_child(pid, status);   // Or whatever you need to do with the PID
    }
}

子の終了ステータスを気にしない場合は、&statusに置き換えることができます。NULL

システムが異なれば、の戻り値はwaitpid()わずかに異なります。ただし、POSIXはより注意深いものの1つであり、次のように述べています。

wait()子プロセスのステータスが使用可能であるためにまたはが返される場合waitpid()、これらの関数は、ステータスが報告される子プロセスのプロセスIDと等しい値を返すものとします。wait()呼び出し側プロセスへのシグナルの配信が原因でまたwaitpid()はが戻った場合は、-1が返され、errnoが[EINTR]に設定されます。オプションでWNOHANGを設定して呼び出された場合waitpid()、ステータスが使用できないpidで指定された子プロセスが少なくとも1つあり、pidで指定されたプロセスでステータスが使用できない場合は0が返されます。それ以外の場合は、-1が返され、エラーを示すためにerrnoが設定されます。

于 2010-04-08T00:24:08.860 に答える