QProcess 被杀死或成功完成
Posted
技术标签:
【中文标题】QProcess 被杀死或成功完成【英文标题】:QProcess Killed or Successfully finished 【发布时间】:2013-07-23 14:20:50 【问题描述】:我如何知道 Qprocess 是否已成功完成执行或已使用 process.kill() 强制终止?在这两种情况下,exitstatus() 都是 normalExit。 有什么办法吗?
【问题讨论】:
【参考方案1】:我不认为有任何特定的函数调用,如果那是你正在寻找的。您没有提及您使用的是什么平台,但在 Linux 的情况下,调用 kill() 会向进程发送一条消息以使其终止,因此就进程而言,完成后一切正常。
您可以做的是子类 QProcess 并重载 kill 函数以设置一个布尔值,您可以在 QProcess 发出 finished() 时检查该值。
【讨论】:
【参考方案2】:QProcesss::exiStatus() 将为您提供此信息。如果 QProcess 正常退出,它将返回 Normal Exit,或者如果进程被杀死,它将返回 Crash Status。
您还可以查看QProcess::exitCode() 以查看该进程的确切退出代码。
以下是使用 SIGKILL 杀死进程时的 Linux 示例。
QProcess subproc;
// Run the process here
subproc.waitForExit();
qDebug() << "Status: " << subproc.exitStatus()
qDebug() << "Code: " << subproc.exitCode()
当子进程运行时,运行以下 Linux 命令:
kill -9 <subproc PID>
然后打印以下内容:
Status: CrashExit
Code: 9
没有对子进程使用kill命令,观察到以下输出:
Status: NormalExit
Code: 0
【讨论】:
我无法在 Qt4 上复制此行为,对于CrashExit
,返回的退出代码仍然为零。此外,从 Qt5 文档中,退出代码不可靠,除非状态为 NormalExit
。我需要知道给定QProcess
的退出代码,但显然它没有提供这样的接口。以上是关于QProcess 被杀死或成功完成的主要内容,如果未能解决你的问题,请参考以下文章
QProcess::startDetached shell 在父进程死亡时被杀死,如果父进程是一个 systemd 服务
如何杀死由 Qt QProcess 运行的 MATLAB 批处理?