SIGKILL
杀死,我希望子进程也能被杀死,这样用户就不必手动跟踪并杀死它们。我知道这个主题以前已经讨论过,但我已经尝试了所有描述的方法,但似乎都不能通过测试。
我知道这一定是可能的,因为终端会一直做到这一点。如果我在终端中运行某些内容,并杀死终端,那些进程总是会死掉。
我尝试过
atexit
,双重fork和ptys
。 atexit
对于sigkill
无效; 双重fork根本不起作用;而且我没有找到使用Python与ptys
配合工作的方法。今天,我了解到
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
接收到一个 SIGKILL
信号并终止,但它并没有。我仍然可以在我的进程管理器中找到它,使用了100%的CPU。请问是否有人能告诉我我对prctl
的使用是否有问题?或者你知道终端是如何杀死它们的子进程的吗?