跳转至

孤儿进程

​ 孤儿进程指:当一个子进程的父进程结束时,子进程还在运行,此时,这个子进程就叫做孤儿进程。最后,孤儿进程会被init进程(进程id为1)进程收养,即将init作为孤儿进程的父进程,当子进程结束时,由init进程完成对它的状态收集工作。因此,孤儿进程是无害的。

Python模拟孤儿进程产生

#!/usr/bin/python
# -*- coding: utf-8 -*
import os,sys,time

pid = os.fork()
getpid = os.getpid()
getppid = os.getppid()
if pid == 0:
    time.sleep(2)
    print "getpid=%d,getppid=%d,该路径为子进程,产生的子进程ID为%d" %(getpid,getppid,pid)
else:
    print "getpid=%d,getppid=%d,该路径为父进程,产生的子进程ID为%d" %(getpid,getppid,pid)

使用os.fork()之后,子进程是父进程的复制品,在内存中会把父进程的代码及内存分配情况拷贝一份生成子进程的运行空间,这样子进程与父进程的所有代码都一样,两个进程之间的运行时独立的,互不影响。在父进程中获取到的pid是子进程的pid号,在子进程中获取的pid是0.

fork()函数被调用一次,返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID

在执行上面这段代码的时候,会有两个独立的运行空间独立的代码来执行,在父进程中执行的时候,由于返回的是子进程的pid,所以不会等于0,就走else。在子进程的独立的运行空间执行上面的那份代码,因为fork给子进程返回的是0,所以就走if那条。

让父进程先执行完,后执行的子进程,这就意味着,子进程执行完了的时候,父进程已经不在了,就成了孤儿进程,孤儿进程最终会由init,也就是进程1收养,把它杀掉

#需要多执行几次,就会出现下面的情况
$ python zone.py 
getpid=3675,getppid=1861,该路径为父进程,产生的子进程ID为3676
getpid=3676,getppid=1,该路径为子进程,产生的子进程ID为0  #ppid已经为1,被进程1收养