我有一个C++程序,叫做C,它被设计成在接收SIGITT信号时关闭。我编写了一个Python程序P,它将C作为子进程运行。我想让P阻止C。我试了三件事,我想知道为什么其中一些不起作用。
尝试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:坏信号'
即使
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中的新功能。机会来了。 最佳答案
第一个失败是因为os.killpg
杀死了一个由其领导者标识的流程组;您有一个简单的流程,而不是流程组。改为尝试os.kill
。第二个失败是因为shell内置的kill
理解符号信号,但是Solaris上的外部命令不理解(而在*BSD和Linux上是这样);在Solaris上使用数字信号(SIGINT
是2
,或者在signal
模块中使用Python的预定义信号常量)。也就是说,使用Popen
自己的界面,而不是像其他人提到的那样;不要重新发明轮子,你可能会创建一些角落。
关于python - 在Solaris上使用Python杀死进程时出现问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6296979/