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,它只意味着您试图访问未映射的内存。您无法阻止它的原因是,在发出信号后,程序会重试导致问题的相同操作。您的信号处理程序必须通过映射内存或将指针更改为有效的对象来解决问题,否则程序将进入无限循环。