【问题标题】:Getting SIGSEGV signal while it's blocking [duplicate]在阻塞时获取SIGSEGV信号[重复]
【发布时间】:2015-08-09 19:19:54
【问题描述】:

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

谢谢。

【问题讨论】:

  • 当引发SIGSEGV 并且处理程序返回时,将重新启动相同的指令(在这种情况下,与导致SIGSEGV 的指令相同)并且您的处理程序将再次被调用——导致无限环形。如果您的程序收到SIGSEGV,则很有可能存在 UB。所以你应该解决这个问题,而不是尝试处理SIGSEGV

标签: c linux unix signals


【解决方案1】:

SIGSEGV 的大部分(如果不是全部)同步生成是未定义行为的结果,因此询问发生了什么没有意义;结果明确未定义。阻塞SIGSEGV 仅在通过killsigqueuepthread_kill 等发送信号时才有意义。

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

【讨论】:

  • 这个答案是合并不同的抽象层。 UB 是您的编程语言的属性。 SIGSEGV 是一个 MMU(虚拟内存硬件)异常。 SIGSEGV 不一定 暗示发生了任何 UB,它仅表示您尝试访问未映射的内存。您无法阻止它的原因是因为在发出信号后,程序会重试导致问题的相同操作。您的信号处理程序必须通过映射内存或将指针更改为有效值来解决问题,否则程序将进入无限循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 2016-05-24
相关资源
最近更新 更多