信号会继续下去直到被调用的过程吗?
例如,我SIGINT向正在等待subprocess.call完成的python进程发出a 。 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"])
Run Code Online (Sandbox Code Playgroud)
$ 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
Run Code Online (Sandbox Code Playgroud)
<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
Run Code Online (Sandbox Code Playgroud)
$ ps aux | grep foo.py
scott 3722 ........ 20:04 0:00 grep --color=auto foo.py
Run Code Online (Sandbox Code Playgroud)
因此,看来,至少subprocess.call在这种情况下,关于“论点”的争论被抹杀了。
链接的问题解决了不同的情况。在那里有一个信号被发送到进程(通过指定pid)。确实,孩子的小品得以生存。
在您的情况下,<Ctrl-C>这本身不是信号;它指示终端驱动程序发送SIGINT到关联的进程组中的每个进程。
根据子流程的创建方式,它可以保留在父流程组中,也可以与其脱离。在后一种情况下,<Crtl-C>在父母的控制终端中键入不会对孩子产生影响。显然,subprocess.call选择让孩子连接到原始控制终端,因此它确实收到了SIGINT。
我不知道是否记录了这种行为。一般来说,这是有道理的。只有恶魔才有理由离婚。
PS:仅* nix。不知道它如何在Windows上工作。
| 归档时间: |
|
| 查看次数: |
41 次 |
| 最近记录: |