从Unix网络编程Vol1第三版第5.10节提取等待和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指定存在,但尚未改变状态,则为0 回。出错时,返回-1。
根据上述文档,如果目前没有子进程终止,waitpid
将返回0
。如果我理解正确,这将导致函数sig_chld
从while
语句中断。
问题>那么我们如何保证这个信号处理程序可以确保收集所有已终止的子进程?
答案 0 :(得分:6)
while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0) {
printf("child %d terminated\n", pid);
如果您没有孩子可以处理,您将不会进入信号处理程序。循环是因为当你在处理程序本身时,第二个或第三个孩子可能已经改变或终止发送不会排队的SIGCHLD。因此,循环实际上可以防止你错过那些可能死去的孩子。当目前没有更多的孩子可以收获时,它将返回0或错误输出-1(ECHILD)。