当我们写服务器程序时,需要考虑服务器通常会运行很长时间,所以必须要包括一个SIGCHLD处理程序,来回收僵死子进程的资源。
因为当SIGCHLD处理程序执行时,SIGCHLD信号是阻塞的,而UNIX信号是不排队的,所以SIGCHLD处理程序必须准备好回收多个僵死子进程的资源。
定义SIGCHLD处理程序:
void handler(int sig)
{
while (waitpid(-1,0,WNOHANG)>0)
echo();//process
return;
}
当有子进程终止时,父进程执行handler。假设在父进程执行handler的时候,有n个子进程终止(即有n个SIGCHLD信号被发送),当n>1时,就会有SIGCHLD被丢弃。
进程 终止时的信号
pid1 sig1
pid2 sig2
pid3 sig3
.
.
例如,当父进程在响应sig1的时候,进程pid2和pid3终止,发送了信号sig2和sig3,那么sig2被阻塞,sig3被丢弃。父进程在处理完sig1之后会对sig2做出响应。父进程对sig2的响应过程首先进入while循环,很明显此时有两个子进程终止,waitpid回收其中的一个(不确定是pid2还是pid3),然后调用echo(),再循环回收另一个。这样就不会出现僵尸进程了!
注意理解waitpid函数不是信号驱动的!
参考资料:http://bbs.chinaunix.net/thread-828942-1-1.html