原因以及如何避免产生僵尸进程

假设子进程的父进程退出, 同时,他们没叫父进程wait/waitpid。子进程将成为僵尸进程。

经ps命令,我们可以看到的过程的状态Z(他代表死亡)。

一般。为了防止产生僵尸进程。在fork子进程之后我们都要wait它们。同一时候,当子进程退出的时候,内核都会给父进程一个SIGCHLD信号。所以我们能够建立一个捕获SIGCHLD信号的信号处理函数,在函数体中调用wait(或waitpid)。就能够清理退出的子进程以达到防止僵尸进程的目的。

正确的解决的方法是调用waitpid而不是wait。这个办法的方法为:信号处理函数中,在一个循环内调用waitpid。以获取全部已终止子进程的状态。我们必须指定WNOHANG选项。他告知waitpid在有尚未终止的子进程在执行时不要堵塞。(我们不能在循环内调用wait,由于没有办法防止wait在尚有未终止的子进程在执行时堵塞,wait将会堵塞到现有的子进程中第一个终止为止)。

符合POSIX的系统信号处理总结:

                1. 一旦安装了信号处理函数,它便一直安装者(较早期的系统是每运行一次就将其拆除)。

                2. 在一个信号处理函数执行期间,正被递交的信号是堵塞的。

                3. 假设一个信号在被堵塞期间产生了一次或多次,那么该信号被解堵塞之后通常仅仅递交一次,也就是说Unix信号缺省是不排队的。

                4. 利用sigprocmask函数选择性地堵塞或解堵塞一组信号是可能的。这使得我们能够做到在一段临界区代码运行期间,防止捕获某些信号。以此保护这段代码。

          

 

版权声明:本文博主原创文章。博客,未经同意不得转载。





本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4909499.html,如需转载请自行联系原作者


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值