码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-09-29 01:08:27      阅读:401      评论:0      收藏:0      [点我收藏+]

标签:内核   posix   unix   僵尸进程   wait   

如果子进程先于父进程退出, 同时父进程又没有调用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函数选择性地阻塞或解阻塞一组信号是可能的。这使得我们可以做到在一段临界区代码执行期间,防止捕获某些信号,以此保护这段代码。          

 

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

标签:内核   posix   unix   僵尸进程   wait   

原文地址:http://blog.csdn.net/fayery/article/details/39377761

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!