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