C 当它';s阻塞

C 当它';s阻塞,c,linux,unix,signals,C,Linux,Unix,Signals,当程序阻塞硬件生成的信号(如SIGSEGV)然后获取该信号时,我无法理解程序的行为。例如,如果有一个与sigaction一起安装的SIGSEGV信号处理程序(信号在处理程序内被阻止),但程序在处理程序内获得另一个SIGSEGV。我找不到在这种情况下程序应该如何运行的描述。据我所知,在Linux上,信号将解锁,程序将崩溃。但是对于其他Unix系统,它是在什么地方指定的呢 谢谢。如果不是所有同步生成的sigsgv都是由于未定义行为,因此询问发生了什么没有意义;结果显式保留为未定义。只有通过kill、

当程序阻塞硬件生成的信号(如
SIGSEGV
)然后获取该信号时,我无法理解程序的行为。例如,如果有一个与sigaction一起安装的
SIGSEGV
信号处理程序(信号在处理程序内被阻止),但程序在处理程序内获得另一个
SIGSEGV
。我找不到在这种情况下程序应该如何运行的描述。据我所知,在Linux上,信号将解锁,程序将崩溃。但是对于其他Unix系统,它是在什么地方指定的呢


谢谢。

如果不是所有同步生成的
sigsgv
都是由于未定义行为,因此询问发生了什么没有意义;结果显式保留为未定义。只有通过
kill
sigqueue
pthread\u kill
等发送信号时,阻塞
SIGSEGV
才有意义


我的实践经验是,如果
SIGSEGV
被阻止,导致
SIGSEGV
的UB会导致程序终止,就像被未被限制的
SIGSEGV
终止一样。但由于它是UB,所以可能根本不会发生陷阱,或者编译器以意外的方式完全重新排序代码,或者优化整个程序。不要依赖这些。

当一个
SIGSEGV
被触发并且处理程序返回时,同一条指令被重新启动(在本例中是导致
SIGSEGV
的同一条指令),处理程序将再次被调用——导致无限循环。如果您的程序接收到
SIGSEGV
,则很可能存在UB。因此,您应该解决这个问题,而不是试图处理
SIGSEGV
。这个答案是将不同的抽象层合并在一起。UB是编程语言的属性。SIGSEGV是一个MMU(虚拟内存硬件)异常。SIGSEGV并不一定意味着发生了任何UB,它只意味着您试图访问未映射的内存。您无法阻止它的原因是,在发出信号后,程序会重试导致问题的相同操作。您的信号处理程序必须通过映射内存或将指针更改为有效的对象来解决问题,否则程序将进入无限循环。