SIGCHLDシグナルを送信したプロセスのpidが何であるかを理解しようとしています。これは、SIGCHLD用に作成したシグナルハンドラーで実行したいと思います。どうすればいいですか?私はしようとしています:
int pid = waitpid(-1, NULL, WNOHANG);
スポーンされる子プロセスを待ちたいからです。
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が設定されます。