分叉蟒蛇,已解散的孩子

Ali*_*010 5 python fork zombie-process

我有一些Python子进程的麻烦所以我写了一个非常简单的脚本:

import os
import sys
import time

pid = os.fork()
if pid:
    #parent
    time.sleep(30)
else:
    #child
    #os._exit(0)
    sys.exit()
Run Code Online (Sandbox Code Playgroud)

当父进程正在休眠时,我启动了

ps fax | grep py[t]hon
Run Code Online (Sandbox Code Playgroud)

我读了这个输出

2577 ?        S      0:00 python /home/pi/python/GPIO/GPIODaemon.py restart
2583 ?        Z      0:00  \_ [python] <defunct>
Run Code Online (Sandbox Code Playgroud)

使用sys.exit()或者os._exit(0)总是有一个Zombie进程,我无法理解为什么.

处理我的更复杂的代码我认为有一些资源,子进程保持锁定,但在这个简化的代码子上没有文件/套接字/数据库连接!为什么孩子过程僵尸?

Bar*_*ven 10

要在Unix中清除子进程,您需要等待子进程,在http://docs.python上检查os.wait(),os.waitpid(),os.wait3()或os.wait4()之一. .ORG/2 /库/ os.html#os.wait

至于为什么会这样,这是Unix的设计决定.子进程将其返回值保持在其进程状态,如果它消失,则您将没有返回值.os.wait()还会返回返回值,然后释放子进程并释放所有关联的资源.

  • 反复的父和子不是一个好主意,你可以使用os.wait4或os.waitpid并使用os.WNOHANG选项进行非阻塞等待.阅读与人类等效的OS系统调用,以了解潜在的问题和使用方法. (5认同)