我使用的是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开发的新手,您对发生的事情有任何想法吗?
答案 0 :(得分:1)
这是因为在你的信号处理程序执行之后,EIP回到导致SIGSEGV的指令 - 所以它再次执行,并再次引发SIGSEGV。
通常忽略SIGSEGV就像你做的那样毫无意义 - 假设指令实际从指针寄存器读取某个值,你会怎么做?您没有任何“正确”值放入寄存器,因此以下代码可能会再次出现SIGSEGV,或者更糟糕的是,会触发一些逻辑错误。
你应该在SIGSEGV发生时退出流程,或者返回已知的安全点 - longjmp应该工作,如果你知道这确实是安全点(唯一可能的例子来到mind是VM解释器/ JIT)。
答案 1 :(得分:0)
您是否尝试在程序中返回0而不是1?传统上,0以外的值表示错误。另外,删除处理* p的两行是否解决了它?