【问题标题】:How to report correctly the abrupt end of another process in Linux?如何正确报告 Linux 中另一个进程的突然结束?
【发布时间】:2014-10-08 02:00:17
【问题描述】:

我正在开发一个嵌入式解决方案,其中两个应用程序正在运行:一个是用户界面,另一个在后台运行,为 UI 提供数据。

最近我遇到了内存泄漏或类似的错误,导致 Linux 杀死辅助进程,使 UI 处于停止状态,而没有告诉用户发生了什么。我通过阅读 Linux 的 message 日志文件和软件在终端“Kill -myapp”上的打印来解决问题。

我的问题是:我怎么会注意到来自辅助软件的此类事件(和其他类似事件),以便我可以正确向用户报告并记录它?我的意思是,很容易不时查看进程“树”以查看辅助应用程序是否正在运行,如果没有,则在 UI 中报告“发生了某些事件”,并且出现错误也是合理的- 辅助应用程序内的处理程序系统,使其将刚刚发生的事情写入日志文件,并让 UI 不时读取该文件以获取新条目,但 UI 应用程序如何更详细地知道发生了什么?突发事件? (在这种情况下,“Linux 杀死进程”,但它可能是“分段管道”或任何其他)(如果有另一个更好的解决方案,即“不断读取辅助应用程序生成的日志文件”,我'我也想知道)

注意:UI 是用 C++/Qt 编写的,辅助应用程序是用 C 语言编写的。虽然使用 Qt 库的解决方案会受到欢迎,但我认为如果提供更通用的解决方案,对整个编程社区来说会更好.

【问题讨论】:

标签: c++ linux qt error-handling runtime-error


【解决方案1】:

您可以在后端进程中为诸如SIGKILL 之类的POSIX 信号创建信号处理程序,并使用例如sigqueue 的另一个信号通知用户界面。只要是异步安全的,任何 IPC 机制都应该有效。阅读有关信号的更多信息:tutorialmanual

定期从 ui 端检查可能仍然是个好主意,因为处理程序可能不会成功。

与读取日志文件相比,检查进程是否处于活动状态的更好方法: Check if process exists given its pid

【讨论】:

  • (从未想过更改您的用户名?:P)感谢您的回复!问:在哪些情况下处理程序可能无法运行? Q2:我知道如何从可能发生错误的应用程序内部编写信号处理程序,但是如何在与发生错误的进程不同的进程中编写?或者您实际上是指以第一种方式编写处理程序?
  • 我觉得我的名字很吸引人 :) 问:嗯,我可能对这个建议过于谨慎了。也许操作系统本身存在一些问题。大多数情况下,我正在考虑覆盖 ui,以防您的处理程序无法执行应有的操作(例如由于错误)。
  • Q2:是的,第一种方式。从终止后端的信号处理程序向 ui 进程发送信号(sigqueue)。或使用任何其他 IPC 机制
猜你喜欢
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 2020-09-21
  • 1970-01-01
相关资源
最近更新 更多