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

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

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

python进程及其子进程(由多进程或子进程启动)都连接到同一终端-具体来说,它们都属于同一进程组。当终端接收到Ctrl-C时,它将发送SIGINT到终端所连接的所有进程,这就是为什么您看到主python线程及其子代收到信号的原因。

当您执行kill -2 PID时,您正在将SIGINT发送到该进程组的特定进程。其他进程将不会被选择。

如果改为执行kill -2 -PGID(注意减号和G),则复制Ctrl-C的操作。这指示杀死以进程组级别为目标的信号;组中的所有进程将接收信号。

您可以运行以下命令来查看每个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

本文链接:https://www.f2er.com/3132398.html

大家都在问