fork()子进程干活儿时,怎样避免僵尸进程的产生
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()。解释见代码中的注释。
[解决办法]想想为什么两次fork的方法中,父进程wait不会产生阻塞。