UnixネットワークプログラミングVol1第3版セクション5.10からの抜粋waitおよびwaitpid関数
#include "unp.h"
void
sig_chld(int signo)
{
pid_t pid;
int stat;
while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0) {
printf("child %d terminated\n", pid);
}
return;
}
...
// in server code
Signal(SIGCHLD, sig_chld); // used to prevent any zombies from being left around
...
..
// in client code
The client establishes five connection with the server and then immediately exit
...
参照waitpid:
戻り値
waitpid():成功すると、状態が変化した子のプロセスIDを返します。WNOHANGが指定され、pidで指定された1つ以上の子が存在するが、まだ状態が変更されていない場合は、0が返されます。エラーの場合、-1が返されます。
上記のドキュメントに基づいて、現時点で子プロセスが終了していない場合にwaitpid
戻ります。0
私が正しく理解していれば、これにより関数がステートメントsig_chld
から外れます。while
質問>したがって、このシグナルハンドラーが、終了したすべての子プロセスが確実に収集されることをどのように保証できますか?