使用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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值