子进程对 SIGINT 信号的反应不同

Subprocess reacts differently on SIGINT signals

b.py

import subprocess
f = subprocess.Popen(['python', 'a.py'])
time.sleep(3000)

a.py

import time
time.sleep(1000)

运行 python b.py,按CTRL+C,两个进程都会终止。

然而向父进程b.py发送SIGINT信号,kill -2 xxxx,但子进程a.py仍然存在

Ctrl-C 在您的终端通常发送 SIGINT 前台进程组 中的所有进程。你的父进程和你的子进程都在这个进程组中。

更详细的解释见例子The TTY demystified or the more technical version by Kirk McKusick at Process Groups and Sessions

如果您只是终止父进程,则子进程将 无父进程,因此重新成为 PID 1(init)的父进程。您也可以在 ps 的输出中看到这一点。由于您的子进程永远不会收到信号,因此它会继续 运行.