给出以下代码:
try:
subprocess.Popen(ExternalProcess, stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True).communicate()
except KeyboardInterrupt:
exit(0)
如果在执行ExternalProcess
(不是python脚本)期间按下 Ctrl + C 命令,究竟发生了什么?< / p>
我可以确定100%在此范围内,如果按 Ctrl + C ,它将始终进入'除',即使它在执行ExternalProcess
期间发生了什么?
或者它取决于外部流程如何处理它?
答案 0 :(得分:19)
据我所知,一旦你分叉/执行一个进程,它就会继承父进程process group。这意味着,SIGINT
(这是 Ctrl + C 的结果和KeyboardInterrupt
的原因)将被发送给孩子和父母。
以下是一个例子:
档案a.py
:
import subprocess
try:
subprocess.Popen("python b.py".split()).communicate()
except KeyboardInterrupt:
print "a.py got ctrl-c"
档案b.py
try:
while True: pass
except KeyboardInterrupt:
print "b.py got ctrl-c"
现在你运行它并停止:
> python a.py
^Cb.py got ctrl-c
a.py got ctrl-c
答案 1 :(得分:2)
我假设你在我的回答中使用了Unix变体。我对Windows世界没有更深入的了解。
如果一切都正常配置,那么C-c
将由终端解释(xterm,gnome-terminal,...)。此终端将发送一个SIGINT(请参阅kill -l
以查找系统的编号,通常是2)连接到与此终端关联的tty设备的进程组的所有进程。这可能是shell启动的shell或程序(及其所有子代,因为进程组被继承)。
然而,孩子可以自愿离开其过程组并创建一个新的过程组。守护程序进程通常这样做是为了避免在父程序中按下 Ctrl-C 意外杀死。