僵尸进程和孤儿进程

Posted zhouhao123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了僵尸进程和孤儿进程相关的知识,希望对你有一定的参考价值。

僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
等待父进程正常结束后会调用wait/waitpid去回收僵尸进程
但如果父进程是一个死循环,永远不会结束,那么该僵尸进程就会一直存在,僵尸进程过多,就是有害的
解决方法一:杀死父进程
解决方法二:对开启的子进程应该记得使用join,join会回收僵尸进程
技术图片
创建完子进程后,主进程所在的这个脚本就退出了,当父进程先于子进程结束时,子进程会被init收养,成为孤儿进程,而非僵尸进程
import os
import sys
import time

pid = os.getpid()
ppid = os.getppid()
print im father, pid, pid, ppid, ppid
pid = os.fork()
#执行pid=os.fork()则会生成一个子进程
#返回值pid有两种值:
#    如果返回的pid值为0,表示在子进程当中
#    如果返回的pid值>0,表示在父进程当中
if pid > 0:
    print father died..
    sys.exit(0)

# 保证主线程退出完毕
time.sleep(1)
print im child, os.getpid(), os.getppid()

执行文件,输出结果:
im father pid 32515 ppid 32015
father died..
im child 32516 1

子进程已经被pid为1的init进程接收了,所以僵尸进程在这种情况下是不存在的,存在只有孤儿进程而已,孤儿进程声明周期结束自然会被init来销毁。
举例

 

以上是关于僵尸进程和孤儿进程的主要内容,如果未能解决你的问题,请参考以下文章

多任务编程 -- 孤儿进程和僵尸进程

孤儿进程和僵尸进程

孤儿进程和僵尸进程

2.4 进程控制之僵尸进程和孤儿进程

僵尸进程和孤儿进程

僵尸进程和孤儿进程