python - 当父进程退出时如何杀死子进程?

arc*_*000 2 python subprocess

fork_child.py 中的代码

from subprocess import Popen
child = Popen(["ping", "google.com"], stdout=subprocess.PIPE,stderr=subprocess.PIPE)
out, err = child.communicate()
Run Code Online (Sandbox Code Playgroud)

我从终端窗口运行它作为 -

$python fork_child.py
Run Code Online (Sandbox Code Playgroud)

如果我从另一个终端窗口获取 fork_child.py 的 PID 并用 SIGTERM 杀死它,“ping”不会被杀死。当 fork_child 收到 SIGTERM 时,如何确保 ping 也被终止?

Aar*_*lla 5

当父进程被杀死时,子进程不会自动死亡。他们会在以下情况下死亡:

  • 父进程转发信号并等待子进程终止
  • 当孩子尝试与父母沟通时,例如通过 stdio。这仅在父级还创建了子级使用的文件描述符时才有效。

signals模块包含如何编写信号处理程序的示例

所以你需要:

  • 收集列表中的所有孩子
  • 安装信号处理程序
  • 在处理程序中,迭代所有子进程
  • 对于每个子进程,调用child.terminate()后跟child.wait()

wait()是允许操作系统垃圾收集子进程所必需的。如果你忘记了它,你最终可能会遇到僵尸进程。