【问题标题】:SIGSEGV sent twice - crashes program after being handledSIGSEGV 发送两次 - 处理后程序崩溃
【发布时间】:2016-03-04 13:05:36
【问题描述】:

我有一个用于处理信号的 C 库的一部分的测试程序。这个测试程序中有很多代码 - 以至于我觉得在这里发布它只会让我更难回答我的问题。

基本上发生的事情是我强迫系统在后台线程内向我发送 SIGSEGV。我处理那个信号,然后测试就结束了。主线程将等待这个,信号处理程序的一部分是重新启动主线程。当主线程重新启动时我通过signal(SIGSEGV, SIG_DFL)恢复默认信号处理程序然后我得到另一个SIGSEGV

我知道我有很多代码,这很可能是我的错,但是对于为什么 SIGSEGV 会触发两次有一个常见的解释吗?当我引起其他信号时,它不会发生(尽管我没有尝试所有这些信号)。

为了澄清我在 OS X 上,用 C 编写,用 gcc 编译。

【问题讨论】:

    标签: c crash signals segmentation-fault


    【解决方案1】:

    如果您在信号处理程序内部有任何问题,例如,内存覆盖,试图访问超出分配的区域,那么将引发一个新信号。详情请查看以下页面。

    http://www.gnu.org/software/libc/manual/html_node/Signals-in-Handler.html

    您还应该在信号处理程序中使用可重入函数,例如 localtime_r 而不是 localtime。

    此外,建议使用 sigaction() 而不是 signal()。

    更多详情:What is the difference between sigaction and signal?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 2010-11-24
      • 1970-01-01
      相关资源
      最近更新 更多