抓住或不抓住

时间:2010-03-16 10:15:23

标签: c++ linux signals

应用程序是否应该捕获SIGSEV,SIGBUS等“坏”信号?

4 个答案:

答案 0 :(得分:7)

当程序处于未定义状态时,这些信号是在“绝不应该发生”的情况下产生的。如果你确实抓住了它们,那么继续执行将是非常有问题的,因为它几乎肯定会导致更多,甚至更严重的错误。此外,如果您没有捕获它们,操作系统可能会执行诸如核心转储之类的有用诊断之类的操作。所以我会说“不”,除非你不想要核心转储,你的错误处理做了一些非常简单的事情,比如写入日志并终止。

答案 1 :(得分:4)

只有你有比默认动作更有意义的事情。你做的不仅仅是快速流产,但有时候试图保存当前的工作就足够了。但要注意不要覆盖现有文件 - 即使过时使用垃圾,用户也不喜欢更换好文件。

答案 2 :(得分:1)

不,你不应该。我知道这很诱人。但是,你想要捕获SIGSEV和SIGBUS等致命信号的原因很少。

少数例外情况之一可能是有一些额外的信令/事后代码,告诉你的程序失败了。即便如此,这只应该在受控环境中完成,而不是在向数十万用户提供的代码中完成。

你必须准备好你的事后代码本身会崩溃,因为SIGSEV和SIGBUS是有缺陷的代码或数据的迹象。

答案 3 :(得分:0)

可能存在必须捕获SIGSEGV和SIGBUS等信号的情况:一个这样的示例是:您的指针指向内存的mmaped区域,并且您正在执行* ptr = x,例如此内存地址属于网络文件而你的网络正在抛出一些错误。此时,进行错误检查的唯一方法是捕获信号并重试或执行其他操作。

相关问题