【发布时间】:2014-11-13 01:26:27
【问题描述】:
我正在尝试分叉一个进程,在子进程中执行某些操作,然后退出它(参见下面的代码)。为了退出,我首先尝试了 sys.exit ,结果发现这是一个问题,因为中间函数捕获了 SystemExit 异常(如下面的代码所示),因此子进程实际上并没有终止。我发现我应该改用 os._exit 。现在孩子终止了,但我仍然看到周围已经失效的进程(当我这样做时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)
也可以。
然后我应该使用一些库可能是真的......
【问题讨论】:
-
首先捕获
SystemExit通常是个坏主意;除非绝对必要,否则我建议不要这样做。 -
其实我自己也没有抓到。我在 BaseHTTPServer.BaseHTTPRequestHandler 中实现 do_POST 并且一些调用它的函数捕获了异常。