读书人

fork()子进程干活儿时怎样避免僵尸进

发布时间: 2013-08-16 14:29:57 作者: rapoo

fork()子进程干活时,怎样避免僵尸进程的产生?
热心网友给了下面三个办法:


避免产生僵尸进程的方法一般有:
1. fork两次,使得孙子进程的父亲为init,孙子进程去执行job
2. 制定自己的SIGCHLD信号处理函数,在这个信号处理函数中调用wait()
3. 通过sigaction系统调用指定信号SIGCHLD处理动作中的sa_flags为SA_NOCLDWAIT


本人如下测试第一个办法,结果还是观察到僵尸进程的产生,请大家帮忙看一看:


#!/usr/bin/env python
#coding=utf8

import os, sys, time
#产生子进程
pid = os.fork()

if pid == 0:
#产生孙进程
pid = os.fork()
if pid == 0:
#TODO: 干活,然后退出
#孙进程退出
sys.exit(0)
elif pid > 0:
#退出子进程
sys.exit(0)
#父进程休息30秒
time.sleep(30)

[解决办法]
父进程sleep前应调用os.wait()。解释见代码中的注释。
引用:
#!/usr/bin/env python
#coding=utf8

import os, sys, time
#产生子进程
pid = os.fork()

if pid == 0:
#产生孙进程
pid = os.fork()
if pid == 0:
#TODO: 干活,然后退出
#孙进程退出
sys.exit(0)
elif pid > 0:
#退出子进程
sys.exit(0)
#父进程休息30秒
# 这时,子进程已退出,但父进程还在运行,所以进程表中还要保持子进程的信息,以供父进程查询,这就是僵尸进程的由来。
# 父进程应调用os.wait()读取子进程的信息,然后子进程就可以安心的去了。
else:
os.wait()
time.sleep(30)

[解决办法]
想想为什么两次fork的方法中,父进程wait不会产生阻塞。

读书人网 >perl python

热点推荐