我想 fork 一个进程,等待父进程退出,然后再对子进程做一些事情。
最佳答案
天真的方法是这样一个繁忙的循环:
# BAD WAY!
pid = os.fork()
if pid == 0:
while True:
if os.path.isdir("/proc/%s" % pid):
break
time.sleep(0.1)
# Parent is dead there.
但这很容易受到 PID 重用问题的影响。如果在父进程退出并获取其 PID 后立即创建另一个进程,则子进程将永远不会退出。
另一种方法是对特定文件使用 flock()
。但这是行不通的,因为 child 与 parent 共享相同的锁。
一个万无一失的方法是使用一个特殊的技巧:在父级中创建一个管道,在子级中,您只需等待直到获得 EOF。
# Good way
read_fd, write_fd = os.pipe()
pid = os.fork()
if pid > 0:
# Close the read pipe, so that only the child is the reader.
os.close(read_fd)
# It is important to voluntarily leak write_fd there,
# so that the kernel will close it for the parent process
# when it will exit, triggering our trick.
elif pid == 0:
# Daemon ourselves first.
os.setsid()
for fd in {0, 1, 2}:
os.close(fd)
# Close the write pipe so that the parent is the only writer.
# This will make sure we then get an EOF when the only writer exits.
os.close(write_fd)
# Now, we're waiting on the read pipe for an EOF.
# PS: the assert is not necessary in production...
assert os.read(read_fd, 1) == ""
os.close(read_fd)
# At this point, the parent is dead.
关于python - 如何等待父进程退出子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48703231/