1 10 <__main__.testfork instance at>
2 57320 <__main__.testfork instance at>
2 57321 <__main__.testfork instance at>
我是主进程 57318
我是子进程 57320
2 57319 <__main__.testfork instance at>
4、收尸
如果父进程还存在,而子进程退出了,那么子进程会变成一个僵尸进程,父进程必须为他收尸。如果父进程先结束了,而子进程还没有结束,此时,子进程的父进程就变成了init进程,由它来负责为子进程退出后收尸。
收尸有两种方法,一个是wait,一个是os.waitpid,wait是阻塞的,而os.waitpid可以设置为非阻塞的,本篇重点讲解waitpid。
4.1 waitpid
waitpid函数定义为 defwaitpid(pid, options),第一个参数取值有以下几种情况:
(1) pid > 0 等待进程ID为pid的子进程,此时是精确打击
(2) pid = 0 等待与调用进程同一个进程组的任意子进程
(3) pid = -1 等待任意子进程,此时和wait等价
(4) pid < -1 等待进程组ID与pid 绝对值相等的所有子进程
4.2 options
options 是以下几个标志位的组合
(1) os.WNOHANG 如果子进程没有发生变化,则立刻返回,不会阻塞