当程序阻止硬件生成的信号(例如SIGSEGV
)然后获取此信号时,我无法理解程序的行为。例如,如果SIGSEGV
的信号处理程序与 sigaction 一起安装(信号在处理程序内被阻止),但程序在处理程序中获得另一个SIGSEGV
。在这种情况下,我找不到程序应该如何表现的描述。据我了解,在Linux上,信号将解除阻塞,程序将崩溃。但是其他Unix系统呢,它是在某处指定的吗?
谢谢。
答案 0 :(得分:2)
SIGSEGV
的大部分同步生成都是未定义行为的结果,因此询问发生的事情没有意义;结果显式未定义。阻止SIGSEGV
仅在通过kill
,sigqueue
,pthread_kill
等发送信号时才有意义。
我在实践中的经验是导致SIGSEGV
的UB会导致程序终止,就像未被捕获的SIGSEGV
一样,如果SIGSEGV
被阻止。但是因为它的UB可能根本没有发生陷阱,或者编译器以意想不到的方式完全重新排序代码或优化整个程序。不要依赖任何一个。