我试图分叉一个进程,在子进程中执行某些操作然后从中退出(请参阅下面的代码)。要退出,我首先尝试了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)
也有效。
然后我可能应该使用一些库......
答案 0 :(得分:4)
You should wait()
for a child to remove its zombie process entry from the table
最后,要将任务卸载给孩子,最好使用multiprocessing
。
答案 1 :(得分:0)
最好根据需要使用子进程模块。它是分离过程的首选方式。
https://docs.python.org/2/library/subprocess.html#subprocess.check_call