在SIGSEGV阻塞时获取SIGSEGV信号

时间:2015-08-09 19:19:55

标签: c linux unix signals

当程序阻止硬件生成的信号(例如SIGSEGV)然后获取此信号时,我无法理解程序的行为。例如,如果SIGSEGV的信号处理程序与 sigaction 一起安装(信号在处理程序内被阻止),但程序在处理程序中获得另一个SIGSEGV。在这种情况下,我找不到程序应该如何表现的描述。据我了解,在Linux上,信号将解除阻塞,程序将崩溃。但是其他Unix系统呢,它是在某处指定的吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

SIGSEGV的大部分同步生成都是未定义行为的结果,因此询问发生的事情没有意义;结果显式未定义。阻止SIGSEGV仅在通过killsigqueuepthread_kill等发送信号时才有意义。

我在实践中的经验是导致SIGSEGV的UB会导致程序终止,就像未被捕获的SIGSEGV一样,如果SIGSEGV被阻止。但是因为它的UB可能根本没有发生陷阱,或者编译器以意想不到的方式完全重新排序代码或优化整个程序。不要依赖任何一个。