gpt4 book ai didi

python - 使用 Python 子进程时,为什么 Ctrl-C 不会产生与 kill -2 相同的行为?

转载 作者:行者123 更新时间:2023-12-04 09:52:38 26 4
gpt4 key购买 nike

如果我通过 Ctrl-C 杀死 Python 进程,所有子进程(由 subprocess 开始)都会死亡。但是,如果我通过 kill -2 终止 Python 进程,子进程继续运行。我以为Ctrl-C与发送 SIGINT 相同(即, kill -2 )。为什么行为不同?

最佳答案

python进程及其由多进程或子进程启动的子进程都连接到同一个终端——具体来说,它们都是同一个进程组的一部分。当终端收到 Ctrl-C 时,它会向连接到终端的所有进程发送 SIGINT,这就是为什么您会看到主 python 线程及其子线程收到信号。

当您这样做时kill -2 PID您正在将 SIGINT 发送到该进程组的特定进程;不会选择其他进程。

如果你这样做 kill -2 -PGID (注意减号和 G ),您复制 Ctrl-C 的操作。这指示 kill 在进程组级别定位信号;组内的所有进程都会收到该信号。

您可以运行此命令来查看每个 Python 进程的进程组 ID:

ps -o pgid,ppid,pid,lwp,sgi_p,fname,cmd -C python

... 示例输出 ....
 PGID  PPID   PID   LWP P COMMAND  CMD
22706 19662 22706 22706 * python python parent.py
22706 22706 22707 22707 * python python /var/tmp/child.py
22706 22706 22708 22708 * python python /var/tmp/child.py
22706 22706 22709 22709 * python python /var/tmp/child.py
22706 22706 22710 22710 * python python /var/tmp/child.py
22706 22706 22711 22711 * python python /var/tmp/child.py

(PGID:组ID,PPID:父ID,PID:进程ID,LWP:线程ID)

...然后将 SIGINT 发送给整个组:
kill -2 -22706

有关 Ctrl-C 和进程组的详细说明,请参见此处: https://unix.stackexchange.com/questions/149741/why-is-sigint-not-propagated-to-child-process-when-sent-to-its-parent-process

关于python - 使用 Python 子进程时,为什么 Ctrl-C 不会产生与 kill -2 相同的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58780638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com