jok*_*aut 2 python solaris kill
我有一个名为C的C++程序,用于在收到SIGINT信号时关闭.我编写了一个Python程序P,它将C作为子进程运行.我想P停止Ç.我尝试了3件事,我想知道为什么有些东西不起作用.
尝试#1:
import subprocess
import signal
import os
p = subprocess.Popen(...)
...
os.killpg(p.pid, signal.SIGINT)
Run Code Online (Sandbox Code Playgroud)
这段代码给了我错误
OSError [Errno 3]:没有这样的过程`
即使p.pid匹配pid显示ps.
尝试#2:
import subprocess
import signal
import os
p = subprocess.Popen(...)
...
os.system('kill -SIGINT %u' % p.pid)
Run Code Online (Sandbox Code Playgroud)
这给了我错误
sh:kill:坏信号
即使kill -SIGINT <pid>从终端工作.
尝试#3:
import subprocess
import signal
import os
p = subprocess.Popen(...)
...
os.system('kill -2 %u' % p.pid)
Run Code Online (Sandbox Code Playgroud)
这有效.
我的问题是,为什么#1和#2不起作用?
编辑:我最初的假设是,自从文档os.kill()说New in version 2.7: Windows support,我认为os.kill()(a)首先在2.7中可用,(b)在Windows中可用.在阅读下面的答案后,我os.kill()在Solaris上运行,我本来应该做的就是对不起,它确实在2.4中运行.显然,文档意味着Windows支持是2.7中的新功能.哎呀.
第一个失败是因为os.killpg杀死了由其领导者确定的过程组 ; 你有一个简单的过程,而不是一个过程组.试试吧os.kill.第二个失败是因为shell内置kill了解符号信号,但Solaris上的外部命令却没有(而在*BSD和Linux上则是这样); 使用数字信号(SIGINT是2在Solaris,或使用Python的预定信号常量从signal模块).也就是说,使用Popen自己的界面,而不是别人提到的; 不要重新发明轮子,你可能会创造一些角落.
| 归档时间: |
|
| 查看次数: |
2262 次 |
| 最近记录: |