QProcess变得不正常并且无法重新启动

3
我是一位有用的助手,可以为您翻译文本。
我正在使用一个QProcess对象列表来跟踪需要在用户定义的时间间隔内启动/停止的一些进程。我能够成功启动和停止这些进程。但是当我使用以下方法停止进程时(伪代码)问题就出现了:
process->start("PathToProcess","Some Arguments");
//Do some stuff.
process->terminate();

然而,如果我在另一个时间尝试重新启动该进程,就会出现以下错误:
QProcess::start:  Process is already running

我可以运行 ps -ef | grep 进程名称 命令,发现该进程确实已经死亡了,但是它处于僵尸状态,我认为这正阻止我再次启动它。
我需要做什么才能防止进程进入僵尸状态,或删除僵尸方法,以便我可以重新启动进程而不需要重建?

你有检查过 process->processState != NotRunning 吗?有时子进程会在没有正确退出的情况下死亡/崩溃。 - mbx
在终止和杀死进程后,我添加了更多的测试,尽管在操作系统中处于僵死状态,但进程仍显示为“正在运行”。做得好。看起来我可能需要自己设置进程状态。 - Chase Henslee
2个回答

8

我找到了导致错误的原因。

在qprocess_unix.cpp文件中,您会发现一个名为QProcessManager的类。该类基本上具有信号处理程序,用于监视已经死亡的子进程。当子进程死亡时,QProcessManager通过管道发送一条消息,让QProcess类知道它已经终止/死亡。

在我的代码的另一个不相关部分,我设置了一些信号捕获语句,用于各种目的。然而,这些信号捕获正在捕获我的SIGCHLD事件,因此QProcessManager从未被触发以向QProcess发送管道消息。

在我的情况下,我的唯一选择是手动监视子进程的死亡或删除我在其他代码部分执行的信号捕获。

供参考,如果您遇到此问题,最好使用POSIX调用来进行杀死和终止,并手动检查这些调用的返回值。如果成功,请执行:

process->setProcessState(ProcessState::NotRunning);//Specify the process is no longer running
waitpid(process->pid(),NULL,WNOHANG); //Clear the defunct process.

感谢大家。

我也遇到过这种情况,当使用mongoose(最后一个免费版本)时:导致了一些困惑 ;) - mBardos

2
在调用process->terminate()后,请在调用process->waitForFinished()以清理僵尸进程。然后您可以重新使用该进程对象。

看起来不太好。当进程结束时,它没有发出finished()信号,所以waitForFinished()永远不会触发。我原以为当程序终止时,状态会从Running变为NotRunning,但看起来并非如此。我会继续研究一下。 - Chase Henslee
当我测试了 process->start("sleep 60"); process->terminate(); process->waitForFinished();,它对我起作用了。 - Ken Bloom
由于某些原因,我的“process->terminate()”从未发送finished()信号。因此,waitForFinished()对我来说失败了。 - Chase Henslee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接