信号会继续下降到被叫进程吗?
例如,我向正在等待SIGINT
完成的python进程发出subprocess.call
。 subprocess.call
被打断。子进程会怎样? SIGTERM
等如何?
@zerkms指出,杀死父进程通常不会将终止信号传递给子进程。但是,使用python subprocess.call
函数很容易检查是否发生了某些事情:
$ python3
>>> import subprocess
>>> with open("foo.py", "w") as f:
... f.write("import time; time.sleep(6000)")
...
29
>>> subprocess.call(["python3", "foo.py"])
$ ps aux | grep foo.py
scott 3716 ........ 20:03 0:00 python3 foo.py
scott 3720 ........ 20:03 0:00 grep --color=auto foo.py
<Ctrl-C>
^CTraceback (most recent call last):
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.6/subprocess.py", line 289, in call
return p.wait(timeout=timeout)
File "/usr/lib/python3.6/subprocess.py", line 1477, in wait
(pid, sts) = self._try_wait(0)
File "/usr/lib/python3.6/subprocess.py", line 1424, in _try_wait
(pid, sts) = os.waitpid(self.pid, wait_flags)
KeyboardInterrupt
$ ps aux | grep foo.py
scott 3722 ........ 20:04 0:00 grep --color=auto foo.py
在这种情况下,至少subprocess.call
的论点似乎被杀死了。
答案 0 :(得分:6)
链接的问题解决了不同的情况。信号被发送到进程(通过指定pid
)。确实,这些孩子的小品得以生存。
在您的情况下,<Ctrl-C>
本身不是信号;它指示终端驱动程序将SIGINT
发送到关联进程组中的每个进程。
取决于子进程的创建方式,它可以保留在父进程组中,也可以与其脱离。在后一种情况下,在父母的控制终端中键入的<Crtl-C>
对孩子没有影响。显然,subprocess.call
选择让孩子与原始控制终端保持联系,因此它确实收到了SIGINT
。
我不知道是否记录了这种行为。一般来说,这是有道理的。只有恶魔才有理由离婚。
PS:仅* nix。不知道它如何在Windows上工作。