我遇到了中断subprocess.Popen
的问题。这是设置:
我有一个Tkinter gui,它使用Popen
运行另一个python脚本。这个内部脚本(我们称之为running script
)正在运行一个shell shell脚本,它使用Popen
执行一段C ++代码,因此层次结构看起来像这样:
GUI
\running_script
\shell-script
\c++
running_script
的工作方式是,如果收到中断,它会将SIGINT发送给shell-script
。如果我用shell_script
单独使用我的C ++代码运行running_script
并执行CRTL + C,一切都像魅力一样。但是,如果我使用GUI运行running_script
作为Popen,SIGINT被发送到running_script
正确接收它并将中断信号发送到shell-script
,而不是终止内部进程(作为c ++代码),shell-script
终止自身,C ++进程继续运行,因为它在后台运行,但事实并非如此。当我执行ps -xaf
时,树看起来像这样:
GUI
\running_script
\shell-script <defunct>
c++
所以重申一下,当我在没有GUI的情况下运行它时,它就像一个魅力,但是使用GUI,它的行为如上所述。我也试过发送shell-command
一个SIGTERM而不是SIGINT,结果是一样的。
答案 0 :(得分:0)
您可以在shell脚本中捕获SIGINT并使其将SIGINT发送到c ++程序,例如:
#!/bin/bash
./cpp_program &
procpid=$!
function killit() {
kill -SIGINT $procpid
}
trap killit SIGINT
......