我有一个名为 C 的C ++程序,用于在收到SIGINT信号时关闭。我编写了一个运行 C 作为子进程的Python程序 P 。我希望 P 停止 C 。我尝试了3件事,我想知道为什么有些东西不起作用。
尝试#1:
import subprocess
import signal
import os
p = subprocess.Popen(...)
...
os.killpg(p.pid, signal.SIGINT)
此代码给出了错误
OSError [Errno 3]:没有这样的过程`
即使p.pid
与ps显示的pid
匹配。
尝试#2:
import subprocess
import signal
import os
p = subprocess.Popen(...)
...
os.system('kill -SIGINT %u' % p.pid)
这给了我错误
sh:kill:bad signal`
即使kill -SIGINT <pid>
来自终端。
尝试#3:
import subprocess
import signal
import os
p = subprocess.Popen(...)
...
os.system('kill -2 %u' % p.pid)
这很有效。
我的问题是,为什么#1和#2不起作用?
编辑:我最初的假设是,由于os.kill()
的文档说New in version 2.7: Windows support
,我认为os.kill()
是(a)首先在2.7中可用,(b)在Windows中可用。在阅读下面的答案后,我在Solaris上运行了os.kill()
,我本来应该做的就是对不起,它确实在2.4中运行。显然,文档意味着Windows支持是2.7中的新功能。 OPPS。
答案 0 :(得分:5)
第一个失败是因为os.killpg
杀死了由其领导者识别的进程组;你有一个简单的过程,而不是一个过程组。请尝试使用os.kill
。第二个失败是因为shell内置kill
了解符号信号,但Solaris上的外部命令却没有(而在* BSD和Linux上它);在Solaris上使用数字信号(SIGINT
为2
,或使用来自signal
模块的Python预定义信号常量)。也就是说,使用Popen
自己的界面,而不是别人提到的;不要重新发明轮子,你可能会产生一些角落。
答案 1 :(得分:1)
Popen
对象有kill()
方法,您可以调用terminate()
方法和通用send_signal()
方法。
我会使用其中一个而不是尝试使用os
接口的任何带外内容。你已经掌握了这个过程,你应该使用它!