c - 存在信号处理程序时出现段错误

标签 c linux signals

尽管有 SIGSEGV 的信号处理程序,但我还是遇到段错误。第一次将数据写入 protected 内存时,我可以看到调用了信号处理程序,但在信号处理程序退出之前,出现了段错误。

可能是什么原因造成的?我的 SIGSEGV 处理程序不是应该捕获所有段错误吗?

最佳答案

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

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

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

关于c - 存在信号处理程序时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6820303/

相关文章:

c - 在 C/C++ 宏中通过 __VA_ARGS__ 迭代添加分隔符

mysql - 比较同一组字符的加密值

linux - 签署虚拟盒模块(vboxdrv、vboxnetflt、vboxnetadp、vboxpci)Centos 8

c - 如何使用 C 中的信号同步两个进程(子进程和父进程)?

c - 标准库与C中用户定义的头文件(.h)及其实现文件(.c)有何不同?

c - 对链表使用自由函数时出现内存错误

c - 引用指针影响后意外的指针更改

我可以在不关闭文件描述符的情况下打开多个 popen 吗?

matlab - 如何将WAV文件映射为整数并在Matlab中播放它们的声音?

python - 在 Django 中注册多个信号