我有一个测试程序,用于处理信号的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()。
更多细节在这里:信号和信号有什么区别?