僵尸进程
僵尸进程讲解
核心:
- 孤儿进程 : 父进程先于子进程退出,此时子进程成为孤儿进程。
特点: 孤儿进程会被系统进程收养,此时系统进程就会成为孤儿进程新的父进程,孤儿进程退出该进程会自动处理。 - 僵尸进程 : 子进程先于父进程退出,父进程又没有处理子进程的退出状态,此时子进程就会称为僵尸进程。
特点: 僵尸进程虽然结束,但是会存留部分PCB在内存中,大量的僵尸进程会浪费系统的内存资源。
Subprocess下僵尸进程产生&收尸
subprocess下僵尸进程产生
僵尸进程的产生内部解释了3种条件:
-
父进程先退出
父进程先退出,子进程还在运行,这时,子进程被init收养,当子进程结束后,init负责对子进程的资源进行回收,这种情况下,不会产生僵尸进程 -
子进程先退出,父进程进行wait()操作
父进程在启动子进程后,执行wait(),子进程退出后,这个wait()操作就负责回收子进程,这样也不会产生僵尸进程。但这样做有个致命的问题,wait是阻塞的,如果进行wait,主进程就什么都做不了。 -
子进程先退出,父进程不进行wait()操作
这种情况,百分百会产生僵尸进程,直到父进程退出,僵尸进程由init收养,init负责执行wait()处理。
下面我写了一个使用subprocess产生僵尸进程的例子。
subprocess的Popen用于在python文件中使用子进程打开bash脚本。
以下面为例,在test_create_zombie_subprocess.py中使用subprocess创建一个子进程,这个子进程打印出自己的PID,如下
print_pid.py
import os
print(os.getpid())
父进程代码如下
create_zombie_process.py
import subprocess
import os
import time
subpro_cmd=["python", "/home/nics/work/test/print_pid.py"]
#p = subprocess.Popen(subpro_cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE,shell=True)
p = subprocess.Popen(subpro_cmd, stdin=subprocess.PIPE )
print("start subprocess %d", os.