【孤儿进程】
-
产生条件:
父进程先于子进程退出,此时子进程就会成为孤儿进程 -
特征:
-
孤儿进程会被系统指定的进程的收养,即系统进程会成为孤儿进程新的父进程
-
当孤儿进程退出时,‘继父’会处理孤儿进程退出状态,使其不会成为僵尸
-
【僵尸进程】
-
产生条件
子进程先于父进程退出,父进程没有处理子进程的退出状态,此时子进程就会成为僵尸进程 -
特征:
*僵尸进程会滞留部分PCB信息在内存中,大量的僵尸进程会消耗系统资源,应该尽量避免僵尸进程的产生
【如果避免僵尸进程】
-
方案1.让父进程先退出(不佳,不好控制)
-
方案2.父进程处理子进程的退出状态
1、使用wait 或者 waitpid 函数
pid,status = os.wait()
功能:在父进程中阻塞等待子进程的退出
参数:无
返回值:一个两个元素的元组(二元元组)
pid:第一个值为退出的子进程PID号,status:第二个值为子进程退出状态
示例:# wait.py import os from time import sleep pid = os.fork() if pid < 0: print('Create process failed') elif pid == 0: sleep(3) print('Child process over') os._exit(3) else: # 等待子进程执行完毕 pid,status = os.wait() print('*****************') print(pid,status) print(os.WEXITSTATUS(status)) # 以上是获取退出状态 while 1: pass
pid,status = os.waitpid(pid,option)
功能:处理子进程的退出状态
参数:
pid -1 表示等待任意子进程退出
>0 表示等待对应PID号的子进程退出
option: 0 表示阻塞等待
OS.WNOHHNG 表示非阻塞
返回值:同wait()
waitpid(-1,0) == wait() #这样传是一样的
示例:
# waitpid.py
import os
from time import sleep
pid = os.fork()
if pid < 0:
print('Create process failed')
elif pid == 0:
sleep(3)
print('Child process over')
os._exit(3)
else:
while True:
sleep(1)
# 设置非阻塞状态,循环处理查看子进程的状态
pid,status = os.waitpid(-1,os.WNOHANG)
print('*****************')
print(pid,status)
print(os.WEXITSTATUS(status))
# 以上是获取退出状态
while 1:
pass
- 创建二级子进程:
1.父进程创建子进程后,等待子进程的退出
2.子进程创建二级子进程后马上退出
3.二级子进程成为孤儿,处理具体事件
示例:
# 创建二级子进程防止僵尸进程
import os
from time import sleep
def fun1():
sleep(3)
print('第一件事情')
def fun2():
sleep(4)
print('第二件事情')
pid = os.fork()
if pid < 0:
print('Create process faild')
elif pid == 0:
# 创建二级子进程
pid0 = os.fork()
if pid0 < 0:
print('crate pid0 failed')
elif pid0 == 0:
fun2()
# 用二级子进程做第二件事情
else:
# 一级子进程退出,使二级子进程成为孤儿
os._exit(0)
# 这是原来的一级子进程
else:
# 等待一级子进程退出
os.wait()
fun1()
# 做第一件事情,父进程该做的事