【问题标题】:Take action after forked application crash分叉应用程序崩溃后采取措施
【发布时间】:2018-06-09 01:39:55
【问题描述】:

我想做一件事,但我不知道这是可能的。

我的应用以控制台中的一些消息开始

std::cout << "appStart" << std:endl

之后,子 Qt 进程会在帧缓冲区(屏幕)中进行绘制。如果我的 Qt 进程出现故障,我可以捕获它并终止 Qt 进程,并且我想在控制台中显示一条消息

std::cout << "app CRASH!" << std:endl

但是屏幕被 Qt 最后一次绘制的内容冻结了,我的消息没有显示在屏幕上。如何清除屏幕并再次显示控制台以查看我的消息?

【问题讨论】:

  • 如何启动要监控的子进程?如果您使用的是QProcess,您可以观察finished() 信号以了解它是正常退出还是崩溃。 (另外,在 Windows 10 上,如果您单击并突出显示控制台窗口中的任何内容,它会冻结窗口以防止添加更多文本。请确保您没有意外这样做。它不止一次让我绊倒。)
  • 请详细说明“如果我的 Qt 进程出现故障,我可以捕获它并终止 Qt 进程”。
  • 与问题无关...这是对问题的简化。我的 Qt 子进程已经完成,我想清理屏幕并再次查看我的 std:cout 消息。这可能吗?
  • @XabiE,是的,当然,这是最相关的事实!但这不可能是真的,因为fork() 用于复制调用进程(即,您不能使用fork() 启动不同的应用程序,您只能使用fork() 创建进程的另一个实例。 )。你还有别的意思吗?
  • @XabiE 听起来您的问题应该以 POSIX 进程处理为框架。除非您想切换过程控制技术,否则 Qt、cout 和 framebuffer 标记在此处不相关。 (更新:我更改了标签。)

标签: c++ unix process fork posix


【解决方案1】:

我终于找到了问题所在。问题是子进程的kill方法。以前我用

关闭了图形过程
SIGKILL     9   /* Kill, unblockable (POSIX).  */

并且进程在没有任何控制的情况下停止,离开屏幕状态。与

#define SIGTERM     15  /* Termination (ANSI).  */

进程正确停止,控制权返回到我的主程序。

【讨论】:

    猜你喜欢
    • 2011-02-21
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多