我正在使用QProcess对象列表来跟踪需要以用户定义的间隔开始/停止的某些进程。
我可以启动和停止进程。但是当我使用以下方法(伪代码)停止进程时会出现问题:
process->start("PathToProcess","Some Arguments");
//Do some stuff.
process->terminate();
但是,如果我尝试在其他时间再次启动该过程,则会收到错误:
QProcess::start: Process is already running
我可以做一个ps -ef | grep processName并发现它确实已经死了,但是它处于一种已经不存在的状态,我认为它会阻止我再次启动它。
我需要做些什么来防止这种失效状态,或者删除已失效的方法,以便我可以重新开始我的过程而不重建?
答案 0 :(得分:7)
找出造成错误的原因。
在qprocess_unix.cpp中,您将找到一个名为QProcessManager的类。本质上,这个类有信号处理程序,可以监视已经死亡的子进程。当一个孩子死亡时,QProcessManager会在管道上发送一条消息,让QProcess类知道它已终止/死亡。
在我的代码的一个不相关的部分,我已经设置了一些信号捕获语句,我用于各种目的。但是,这些信号捕获正在捕获我的SIGCHLD事件,因此永远不会触发QProcessManager来管道它死亡的QProcess。
在我的情况下,我唯一的选择是手动监视孩子的死亡或者删除我在其他代码段中执行的信号。
为了将来参考,如果你遇到这个问题,最好还是做POSILL调用以终止并终止,并手动检查这些调用的返回值。如果成功,请执行:
process->setProcessState(ProcessState::NotRunning);//Specify the process is no longer running
waitpid(process->pid(),NULL,WNOHANG); //Clear the defunct process.
谢谢大家。
答案 1 :(得分:2)
致电process->waitForFinished()
后致电process->terminate()
以获取僵尸流程。然后,您可以重用过程对象。