我有一个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.pidps显示的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上使用数字信号(SIGINT2,或者在signal模块中使用Python的预定义信号常量)。也就是说,使用Popen自己的界面,而不是像其他人提到的那样;不要重新发明轮子,你可能会创建一些角落。

关于python - 在Solaris上使用Python杀死进程时出现问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6296979/

10-10 20:56
查看更多