为什么这个信号处理程序被无限调用

时间:2010-12-26 07:38:33

标签: macos signals

我使用的是Mac OS 10.6.5,g ++ 4.2.1。并满足以下代码的问题:

#include <iostream>
#include <sys/signal.h>
using namespace std;

void segfault_handler(int signum)
{
    cout << "segfault caught!!!\n";
}

int main()
{
    signal(SIGSEGV, segfault_handler);

    int* p = 0;
    *p = 100;

    return 1;
}

看来segfault_handler被无限调用并继续打印:

  

segfault抓住!!!
  segfault抓住!!!
  segfault抓住!!!
  ...

我是Mac开发的新手,您对发生的事情有任何想法吗?

2 个答案:

答案 0 :(得分:1)

这是因为在你的信号处理程序执行之后,EIP回到导致SIGSEGV的指令 - 所以它再次执行,并再次引发SIGSEGV。

通常忽略SIGSEGV就像你做的那样毫无意义 - 假设指令实际从指针寄存器读取某个值,你会怎么做?您没有任何“正确”值放入寄存器,因此以下代码可能会再次出现SIGSEGV,或者更糟糕的是,会触发一些逻辑错误。

你应该在SIGSEGV发生时退出流程,或者返回已知的安全点 - longjmp应该工作,如果你知道这确实是安全点(唯一可能的例子来到mind是VM解释器/ JIT)。

答案 1 :(得分:0)

您是否尝试在程序中返回0而不是1?传统上,0以外的值表示错误。另外,删除处理* p的两行是否解决了它?

相关问题