QProcess 失效且无法重新启动

Posted

技术标签:

【中文标题】QProcess 失效且无法重新启动【英文标题】:QProcess becomes defunct and unable to start again 【发布时间】:2011-08-18 20:09:14 【问题描述】:

我正在使用 QProcess 对象列表来跟踪一些需要以用户定义的时间间隔启动/停止的进程。

我可以启动和停止进程了。但是当我使用以下方法(伪代码)停止进程时会出现问题:

process->start("PathToProcess","Some Arguments");
//Do some stuff.
process->terminate();

但是,如果我尝试在其他时间再次启动该过程,则会收到错误消息:

QProcess::start:  Process is already running

我可以执行 ps -ef|grep processName 并发现它确实已经死了,但它处于失效状态,我认为这会阻止我再次启动它。

我需要做些什么来防止这种失效状态,或者删除失效的方法以便我可以在不重建的情况下重新开始我的流程?

【问题讨论】:

你检查过process->processState != NotRunning吗?有时孩子们在没有正确退出的情况下死亡/崩溃。 在终止后并在我添加了一个 kill 以进行更多测试后,尽管在操作系统中处于失效状态,该进程仍显示为“正在运行”。好决定。好像我可能需要自己做 setProcessState。 【参考方案1】:

找出导致错误的原因。

在 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.

谢谢大家。

【讨论】:

也发生在我身上,当使用猫鼬(最后一个免费版本)时:导致一些头部抓挠;)【参考方案2】:

在调用process->terminate() 之后调用process->waitForFinished() 以获得僵尸进程。然后就可以重用进程对象了。

【讨论】:

看起来不太好。当进程结束时,它不会发出 finished() 信号,因此 waitForFinished() 永远不会触发。我假设当一个程序终止时,它会将状态从 Running 更改为 NotRunning,但看起来情况并非如此。我会继续关注的。 当我使用process->start("sleep 60"); process->terminate(); process->waitForFinished(); 进行测试时,它对我有用。 出于某种原因,我的“process->terminate()”从不发送finished() 信号。所以 waitForFinished() 对我来说失败了。

以上是关于QProcess 失效且无法重新启动的主要内容,如果未能解决你的问题,请参考以下文章

linux vim设置在重新启动软件后失效,需要重新设置才行

delphi无法启动

在 Qt 中隐藏和重新启动相同的 QApplication 实例

有没有办法在不重新启动应用程序的情况下使 NSBundle 本地化缓存失效? [iOS]

QProcess 无法启动进程:未找到进程

Qt:无法使用 QProcess 启动 Windows 控制台