我有一个测试程序,用于处理信号的C库的一部分。这个测试程序中有很多代码 - 我觉得在这里发布它只会让我更难回答我的问题。
基本上发生的事情是我强迫系统在后台线程中向我发送SIGSEGV。我处理了那个信号,然后测试结束了。主线程将等待这一点,部分信号处理程序将重启主线程。当主线程重新启动时我通过 signal(SIGSEGV, SIG_DFL)
恢复默认信号处理程序,然后我得到另一个 SIGSEGV 。
我知道我有很多代码,这很可能是我的错,但有一个共同的解释,为什么SIGSEGV会发射两次?当我发出其他信号时,它并没有发生(虽然我还没有尝试过所有这些信号)。
澄清我在OS X上,用C语言编写,用gcc编译。
答案 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?