Qt检查外部进程是否崩溃

时间:2014-01-27 08:58:40

标签: c++ qt

我正在为专业视频构建故障安全应用程序。 Qt应用程序检查第二个屏幕的4个角,如果它们是某个RGB值(我使用特殊背景),Qt程序知道它崩溃了,所以它向视频混合器发送信号以淡入另一个输入。

现在我还要添加一个检查以查看视频程序是否没有崩溃(可能是视频程序没有响应但仍显示输出,所以我无法在第二个屏幕上看到桌面) 。我知道我可以使用Qprocess来启动外部进程。将它连接到已经运行的进程并不容易。

现在的问题是:如何检查程序是否崩溃(所以“没有响应”)并尽可能快地查看,以便我可以淡入其他视频输入。当我的Qt程序崩溃时会发生什么,它是否也会退出子进程?

谢谢!

2 个答案:

答案 0 :(得分:1)

使用QProcess会创建一个附加进程,所以不幸的是,当进程终止时它将被终止。使用静态方法QProcess::startDetached创建分离进程时,您无法获得监视功能。

您需要编写一个特定于平台的监视类,它可以启动分离进程并通知您其状态的变化。您需要使用本机API来实现它。 QProcess的来源可以为从哪里开始提供良好的灵感。

答案 1 :(得分:0)

@KubaOber在他的陈述中部分正确。如果你开始并分离一个进程确实你放弃了与它通信的Qt方式并监视它的作用。但是,您的操作系统提供了大量的解决方案来监督它发生的事情。 在Linux上,您可以使用:

  • pgrep检查进程是否正在运行(作为子进程执行命令并查看它是否返回0(进程正在运行)或1(进程不再运行)
  • 您可以使用proc文件系统来查看进程何时终止(请参阅here)然后使用$?或变量(如链接中所述)来检查其退出状态
  • kill可以为您提供大量控制可能性以及管道

但是你应该注意到,特别是在Windows上有很多程序不遵循退出代码的Unix约定(0 =正常退出,其他任何事情 - 发生了错误)。此外,崩溃只是一个错误状态,该过程最终结束。退出代码告诉您发生了错误,但就崩溃而言,您可能无法通过查看它来发挥作用。