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