使用waitpid避免僵尸进程

当我们写服务器程序时,需要考虑服务器通常会运行很长时间,所以必须要包括一个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

你可能感兴趣的:(linux,linux,僵尸进程,并发编程,unix,服务器)