在python中分叉和从子级退出

在python中分叉和从子级退出,python,fork,system,exit,Python,Fork,System,Exit,我正在尝试分叉一个进程,在子进程中执行一些操作,然后退出它(请参阅下面的代码)。为了退出,我首先尝试了sys.exit,这是一个问题,因为中间函数捕获了SystemExit异常(如下面的代码所示),因此子函数实际上没有终止。我想我应该用操作系统来代替。现在,子进程终止了,但我仍然可以看到不存在的进程(当我执行ps-ef时)。有没有办法避免这些 import os, sys def fctn(): if os.fork() != 0: return 0 # sys.e

我正在尝试分叉一个进程,在子进程中执行一些操作,然后退出它(请参阅下面的代码)。为了退出,我首先尝试了sys.exit,这是一个问题,因为中间函数捕获了SystemExit异常(如下面的代码所示),因此子函数实际上没有终止。我想我应该用操作系统来代替。现在,子进程终止了,但我仍然可以看到不存在的进程(当我执行ps-ef时)。有没有办法避免这些

import os, sys

def fctn():
    if os.fork() != 0:
        return 0
#   sys.exit(0)
    os._exit(0)

while True:
    str = raw_input()
    try:
        print(fctn())
    except SystemExit:
        print('Caught SystemExit.')
编辑:这实际上不是一个Python问题,而是一个Unix问题(因此我猜结果可能因系统而异)。伊万的回答建议我应该做一些类似的事情

def handleSIGCHLD(sig, frame):
    os.wait()

signal.signal(signal.SIGCHLD, handleSIGCHLD)
而对我来说,一个简单的

signal.signal(signal.SIGCHLD, signal.SIG_IGN)
同样有效

然后我可能真的应该使用一些库…

最后,为了把任务转移给孩子们,你最好带上它。


最后,要将任务卸载给孩子,最好使用。

根据需要使用子流程模块。这是一个过程分叉的首选方式


您最好根据需要使用子流程模块。这是一个过程分叉的首选方式


OP没有调用
os.exec*()
,因此整个
子流程
模块不适合此用例(即,它们没有执行一些外部二进制文件,因此没有任何东西可以传递给
子流程.call()
和朋友)。对,我误解了此上下文中的“fork a process and do with the child”。投票支持另一个回答者并不是在调用
os.exec*()
,所以整个
子流程
模块不适合这个用例(也就是说,他们没有执行一些外部二进制文件,所以没有任何东西可以传递给
子流程.call()
和朋友)。对吧,我误解了“fork a process and do with the child”在这方面。投票选出另一个答案首先抓住
SystemExit
通常是个坏主意;除非绝对必要,否则我建议不要这样做。事实上,我自己并没有抓到它。我正在BaseHTTPServer.BaseHTTPRequestHandler中实现do_POST和一些调用它的函数捕获异常;除非绝对必要,否则我建议不要这样做。事实上,我自己并没有抓到它。我正在BaseHTTPServer.BaseHTTPRequestHandler中实现do_POST,以及一些调用它捕获异常的函数。