python僵尸进程的产生和僵尸进程自动处理

僵尸进程

僵尸进程讲解
核心:

  1. 孤儿进程 : 父进程先于子进程退出,此时子进程成为孤儿进程。
    特点: 孤儿进程会被系统进程收养,此时系统进程就会成为孤儿进程新的父进程,孤儿进程退出该进程会自动处理。
  2. 僵尸进程 : 子进程先于父进程退出,父进程又没有处理子进程的退出状态,此时子进程就会称为僵尸进程。
    特点: 僵尸进程虽然结束,但是会存留部分PCB在内存中,大量的僵尸进程会浪费系统的内存资源。

Subprocess下僵尸进程产生&收尸

subprocess下僵尸进程产生

僵尸进程的产生内部解释了3种条件:

  1. 父进程先退出
    父进程先退出,子进程还在运行,这时,子进程被init收养,当子进程结束后,init负责对子进程的资源进行回收,这种情况下,不会产生僵尸进程

  2. 子进程先退出,父进程进行wait()操作
    父进程在启动子进程后,执行wait(),子进程退出后,这个wait()操作就负责回收子进程,这样也不会产生僵尸进程。但这样做有个致命的问题,wait是阻塞的,如果进行wait,主进程就什么都做不了。

  3. 子进程先退出,父进程不进行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.
  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值