c++ - QProcess 已失效且无法重新启动

标签 c++ qt qprocess

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

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

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

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

QProcess::start:  Process is already running

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

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

最佳答案

找出导致错误的原因。

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

在我的代码的一个不相关的部分,我设置了一些用于各种目的的信号捕获语句。但是,这些信号捕获正在捕获我的 SIGCHLD 事件,因此 QProcessManager 从未被触发以通过管道传输到它已死亡的 QProcess。

在我的例子中,我唯一的选择是手动观察 child 的死亡或删除我在其他代码部分执行的信号捕获。

为了将来引用,如果您遇到此问题,最好执行 POSIX 调用以终止和终止,并手动检查这些调用的返回值。如果成功,执行:

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

谢谢大家。

关于c++ - QProcess 已失效且无法重新启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7113506/

相关文章:

c++ - Qt渲染到离屏显示,复制到可见不覆盖背景

qt - 如何重新启用qt对话框中的关闭按钮

c++ - 如何在进程结束时保持 QProcess 执行的命令?

qt4 - 使用 QProcess 恢复 MySQL 数据库,无法真正使用像 '<' 这样的简单重定向

python - PyQt:多个 QProcess 和输出

C++ 编译器错误(试图创建 vector 的静态 vector )

c++ - 使用安全向下转换的类设计选项

c++ - 使用 +(一元加)解决 lambda 的函数指针和 std::function 上的不明确重载

c++ - 仅在单击 "open"时关闭 QFileDialog

c++ - 使用QImage(qt)生成文字图片