SIGSEGV在处理后发送了两次崩溃程序

时间:2016-03-04 13:05:37

标签: c crash segmentation-fault signals sigsegv

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

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

我知道我有很多代码,这很可能是我的错,但有一个共同的解释,为什么SIGSEGV会发射两次?当我发出其他信号时,它并没有发生(虽然我还没有尝试过所有这些信号)。

澄清我在OS X上,用C语言编写,用gcc编译。

1 个答案:

答案 0 :(得分:0)

如果您在信号处理程序中有任何问题,例如,内存覆盖,尝试访问超出分配区域,则会引发新信号。有关详细信息,请查看以下页面。

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?