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 服务

QProcess.start 不返回退出状态或退出代码

等待 QProcess 完成或持续时间超过 [重复]

如何杀死由 Qt QProcess 运行的 MATLAB 批处理?

Qt:如何连接“DialogClass1”的 QPushButton 来杀死“Class2”中的 QProcess?

使用 QProcess 通过 PyQt 运行和监控系统进程