在python3中,我正在创建分叉的子进程,我想 - 我正确地退出了。这是一些代码示例:
import os
child_pid = os.fork()
if child_pid == 0:
print("I am in the child with PID "+str(os.getpid()))
# doing something
a = 1+1
print("Ending child with PID "+str(os.getpid()))
os._exit(0)
else:
#parent process
os.waitpid(-1, os.WNOHANG)
import time
for x in range(100):
time.sleep(1)
print("waiting...")
现在,由于儿童过程似乎已经结束,它仍然可以被看作是一个“已经不复存在”的过程。进程(父进程仍在运行时)。如何真正摆脱那个结束的儿童过程?如何更改代码?
答案 0 :(得分:1)
如果您不希望父级等待,您可以使用双叉习语。 (见What is the reason for performing a double fork when creating a daemon?)
基本思路是父进程(称之为P
)分叉一个子(C1
),它立即再次创建另一个子进程(C2
),然后退出。在这种情况下,由于C2
的父级已死,init
进程将继承C2
并等待它。您仍需要在C1
进程中P
等待,否则C1
将成为僵尸。但是,C1
仅运行很短的时间,因此P
进程不会等待很长时间。运行C2
的代码可以根据需要花费尽可能多的时间,而不关心它是否在P
之前或之后完成。
另一个想法是处理孩子退出时发生的SIGCHILD信号。来自https://mail.python.org/pipermail/tutor/2003-December/026748.html
import os,signal
def handleSIGCHLD():
os.waitpid(-1, os.WNOHANG)
signal.signal(signal.SIGCHLD, handleSIGCHLD)