C语言 SIGSEGV 发送两次 - 处理程序崩溃



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

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

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

澄清一下,我在OS X上,用C编写,用gcc编译。

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

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

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

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

更多细节在这里:信号和信号有什么区别?

最新更新