如何在子进程中检测父进程是否已终止?

7 投票
2 回答
1794 浏览
提问于 2025-04-16 15:58

在Python中,我有一个父进程,它会创建几个子进程。最近我遇到了一个问题,由于父进程出现了未处理的异常,导致它崩溃了,而子进程则变成了孤儿进程。请问我该如何让子进程知道它们失去了父进程呢?

我尝试了一些代码,把子进程连接到所有可用的信号上,但没有一个信号被触发。理论上,我可以在父进程周围加一个大的try/except块,确保它至少能给子进程发送一个终止信号,但这样做既不优雅也不可靠。我该如何防止孤儿进程的出现呢?

2 个回答

10

在UNIX系统(包括Linux)上:

def is_parent_running():
    try:
        os.kill(os.getppid(), 0)
        return True
    except OSError:
        return False

需要注意的是,在UNIX系统中,信号0并不是真正的信号。它只是用来检查某个进程是否存在。可以查看kill命令的手册了解更多信息。

5

你可以使用 socketpair() 来创建一对 Unix 域套接字,这个操作最好在创建子进程之前进行。父进程打开一端,子进程打开另一端。当父进程退出时,它那一端的套接字会关闭。这样,子进程就能知道父进程已经退出,因为它可以通过 select()poll() 来监听自己套接字的读事件,并在那时收到文件结束的信号。

撰写回答