我有一个程序产生并与 CPU 繁重、不稳定的进程通信,而不是我创建的。如果我的应用程序崩溃或被杀死SIGKILL
,我希望子进程也被杀死,这样用户就不必追踪它们并手动杀死它们。
我知道这个话题之前已经讨论过,但我已经尝试了所有描述的方法,但似乎没有一个能够经受住考验。
我知道这一定是可能的,因为终端一直在这样做。如果我在终端中运行某些东西并杀死终端,那么这些东西总是会死掉。
我试过了atexit
,双叉和ptys
。atexit
不适用于sigkill
; 双叉根本不起作用;而且ptys
我发现无法使用python。
今天,我发现了prctl(PR_SET_PDEATHSIG, SIGKILL)
,这应该是子进程在父进程死亡时命令自己杀死自己的一种方式。我尝试将它与 一起使用popen
,但它似乎完全没有效果:
import ctypes, subprocess
libc = ctypes.CDLL('/lib/libc.so.6')
PR_SET_PDEATHSIG = 1; TERM = 15
implant_bomb = lambda: libc.prctl(PR_SET_PDEATHSIG, TERM)
subprocess.Popen(['gnuchess'], preexec_fn=implant_bomb)
在上面,孩子被创建,父母退出。现在您会期望gnuchess
收到 aSIGKILL
并死掉,但事实并非如此。我仍然可以在使用 100% CPU 的进程管理器中找到它。
谁能告诉我我使用prctl
? 是否有问题,或者你知道终端如何设法杀死他们的孩子吗?