3

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

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

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

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

QProcess::start:  Process is already running

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

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

4

2 回答 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.

谢谢大家。

于 2011-08-19T13:32:33.260 回答
2

调用process->waitForFinished()后调用process->terminate()以获得僵尸进程。然后您可以重用流程对象。

于 2011-08-18T20:35:32.907 回答