Linux 中的异常处理

问题描述 投票:0回答:1

我一直在研究Linux中的异常处理。我知道(在某种程度上)Linux 使用信号机制来通知 SIGSEGV、SIGFPE、SIGINT 等进程。要捕获这些信号,需要使用 sigaction 显式注册它们。

我的问题:

  1. 是否有一个“包罗万象”的异常处理程序?使用信号机制,我需要显式注册信号。但我想捕获所有信号,并确保尽可能向用户显示一条消息,并且应用程序不会退出。并获取一些日志进行诊断。 Windows 有一个使用 SetUnhandledExceptionHandler 设置的“包罗万象”的异常处理程序。 Linux 有类似的东西吗?
  2. 从我到目前为止所读到的内容来看,信号似乎是捕获异常的唯一方法(如 SIGINT、SIGSEGV、SIGFPE 等)。如果我需要使用信号,行为应该是什么?如果主线程引发 SIGSEGV,那么它将陷入循环(引发 SIGSEGV <-> 异常处理程序的代码),我会向用户显示一些消息吗?如果工作线程(由应用程序创建)遇到 SIGSEGV,那么我打算终止该工作线程(从而避免循环)并向主线程发出信号以向用户显示消息并优雅地展开。

我打算将 GTK 用于应用程序的 UI(包括消息屏幕)。我正在寻找一种 Linux 推荐的方法来处理异常并优雅退出,以提供良好的用户体验。

c++ linux signals
1个回答
0
投票

我想捕获所有信号

不,你不知道。或者至少你不应该这样做。

信号是:

  • 技术性的东西(如果你拦截这些东西,事情可能会崩溃):
    • HUP、疏水阀、管道、警报、CHLD、绞盘、RT*
  • 崩溃(您可能对这些感兴趣):
    • SEGV、公交车、FPE、ILL
    • 可能是ABRT
  • 用户/系统交互(拦截可能是不礼貌的行为):
    • INT、退出、学期、TSTP、PWR

向用户显示消息,应用程序不会退出

有一定可能。但是,如果您有一个刚刚损坏了内存的多线程程序,那么显示该消息的最佳位置可能来自不同的进程。 @Eljay 在评论中建议的某种外部监控流程。

我打算杀死工作线程(因此避免循环)并通知主线程向用户显示消息并优雅地展开

如果您有一个多线程程序,其中工作线程持有一些锁,并且您终止了它,则您将无法取回这些锁。尝试在同一进程中(甚至在不同的线程中)执行任何重要操作可能会导致死锁/进一步崩溃。

在该处理程序中您最多可以做的就是以尽可能简单的方式记录您可以获取的信息(信号安全提醒),然后戳您的监控进程,时间到了。

如果您正在处理文档,是否应该尝试保存一些数据(如果可以)?假设事物已损坏/损坏。所以通常不会。

© www.soinside.com 2019 - 2024. All rights reserved.