存在信号处理程序时的分段错误

时间:2011-07-25 17:57:54

标签: c linux signals

尽管SIGSEGV有一个信号处理程序,但我得到了分段错误。第一次将数据写入受保护的内存时,我可以看到信号处理程序被调用,但在信号处理程序退出之前,会出现分段错误。

可能导致什么?是不是我的SIGSEGV处理程序应该捕获所有分段错误?

2 个答案:

答案 0 :(得分:4)

我可以看到,如果分段错误与访问内存的堆栈指针有关,操作系统不允许这样做,那么您将无法使用当前堆栈指针进行任何调用...包括对信号处理程序的调用。换句话说,编译器为信号处理函数创建的序言必须在堆栈上设置激活记录...如果堆栈指针本身无效,那么这是不可能的。这可能发生的一种方法是溢出一个内存数组,然后写入当前正在执行的函数的激活记录。

您可以通过sigaltstack()定义另一个内存区域作为信号处理程序的堆栈,然后在SA_ONSTACK中为信号设置sigaction()选项。这可能是您可能想要尝试的内容。

最后,如果您正在使用非异步安全函数或以某种方式访问​​指针或内存,而这些指针或内存位于由信号处理程序中的操作系统分配给您的进程的内存段之外,那么您也会遇到问题。

答案 1 :(得分:2)

如果你的信号处理程序依次引发另一个信号,当然你的信号处理程序没有捕获,那么你会有一种无限循环。