我遇到了杀死子进程的问题。以下代码用于创建子进程:
while(not myQueue.empty()):
p=Popen(myQueue.get(),shell=True,stdin=PIPE,stderr=PIPE)
我正在通过迭代来创建进程,直到队列(其中包含命令)为空为止。变量p是全局的,并且是类型为Popen的对象。尽管该命令已经按照预期执行了它应该执行的操作,但我的停止按钮没有像我预期的那样停止进程。
停止按钮的代码如下:
stop=Button(textBoxFrame,text="Stop",width=5,command=stopAll)
stop.grid(row=1,column=4)
stopAll 方法由上述停止按钮调用,它将终止当前子进程 p。
def stopAll():
p.kill()
注意-没有错误、异常或任何编译问题。
更新:
问题在于p.kill()
没有杀死我需要杀死的进程。我使用unix检查了这个问题,使用>> ps aux
。我还让我的程序输出启动和杀死PID,以便可以使用ps aux
检查它们。我发现需要杀死的进程距离p.pid
有6个PID,我尝试像这样杀死进程os.kill((p.pid)+6,signal.SIGKILL)
,它正在工作并停止正确的进程。但我不想那样做,因为有可能导致杀死不同的子进程。我会在我的问题上提供更多细节-
我在这里使用的队列包含命令,就像我之前说的那样。命令是这样的-
echo "Hello"|festival --tts
Festival是Unix中的语音合成器,而festival --tts
可以从文件获取用户输入。我正在将"Hello"
发送到Festival,它能正确朗读单词。但执行以上命令的p
进程却杀死了echo
而不是Festival
。因此,请帮助我结束特定的(Festival)进程。