2015-03-13 12 views
0

b.py子流程上SIGINT信号的反应不同

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

a.py

import time 
time.sleep(1000) 

运行Python b.py,按CTRL + C,这两个过程将终止。

但是,将信号SIGINT发送到父进程b.py,kill -2 xxxx,但子进程a.py仍然存在。

+0

是什么让你认为CTRL-C作为一个SIGINT来处理? – 2015-03-13 07:59:07

+0

错字。 SIGINT。无论如何,我正在谈论信号2 – user3201982 2015-03-13 08:01:38

+0

同样的问题,是什么让你认为CTRL-C是一个简单的SIGINT?你在使用什么操作系统? – 2015-03-13 08:05:22

回答

1

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

如需更详细的说明,请参见例如The TTY demystifiedProcess Groups and Sessions

更多的技术版本由Kirk McKusick如果你只是杀死父母的过程中,孩子是父母双亡的孤儿因而被重设父以PID 1(在里面)。你也可以在ps的输出中看到。由于你的子过程从来没有收到信号,它只是继续运行。

+0

是的,那正是我需要的。我不在乎一个孤儿过程,我的最初目的是保持它即使父过程死亡也能运行。然后ctrl + c的问题来打扰我。看起来我必须在前台过程中捕获这些信号。 – user3201982 2015-03-13 08:51:45

+0

我想你想要的是*守护*孩子。实际上有一个PEP:https://www.python.org/dev/peps/pep-3143/ – dhke 2015-03-13 08:55:34

+0

这个文件太复杂了,我不明白。我可以使用subprocess.Popen来运行一个新的进程吗?当然,将preexec_fn参数设置为os.setsid(),以便使子进程与父进程组分离。 – user3201982 2015-03-13 09:35:53