首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

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

2013-08-16 
fork()子进程干活时,怎样避免僵尸进程的产生?热心网友给了下面三个办法:避免产生僵尸进程的方法一般有:1.

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不会产生阻塞。

热点排行