【问题标题】:QProcess Killed or Successfully finishedQProcess 被杀死或成功完成
【发布时间】:2013-07-23 14:20:50
【问题描述】:

我如何知道 Qprocess 是否已成功完成执行或已使用 process.kill() 强制终止?在这两种情况下,exitstatus() 都是 normalExit。 有什么办法吗?

【问题讨论】:

    标签: qt kill qprocess


    【解决方案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 的退出代码,但显然它没有提供这样的接口。