SIGSEGV发送两次 - 处理后崩溃程序
问题描述:
我有一个测试程序,用于处理信号的C库的一部分。在这个测试程序中有很多代码 - 非常多,我觉得在这里发布它只会让我更难回答我的问题。SIGSEGV发送两次 - 处理后崩溃程序
基本上发生的事情是,我迫使系统在后台线程中向我发送一个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()。
更多细节在这里:What is the difference between sigaction and signal?