linux下进程收到sigsegv信号,如果我捕获SIGSEGV并且信号处理程序导致另一个SIGSEGV会发生什么?...

在Linux中考虑这个问题.使用GCC编译器.

如果SIGSEGV(我的意思是通常导致SIGSEGV的违规)发生在信号处理程序中,其目的是捕获SIGSEGV,那么可以预期什么行为?帮助讨论的代码示例:

/* In main or whatever */

{

struct sigaction sa = {}; /* initialised to all zero (I vote for GCC style breach of standard here) */

sa.sa_handler = DisasterSignals;

sa.sa_flags = SA_RESETHAND | SA_NODEFER; /* To have or have not */

sigaction(SIGSEGV,&sa,NULL);

}

static void DisasterSignals(int signal)

{

/* We cannot save the situation,the purpose of catching the signal is

only to do something clever to aid debugging before we go. */

/* Q: What if we segfault in here?? */

abort(); /* This should give us the expected core dump (if we survive to this point) */

}

想象一下,在“Q”点,有一个违规的机器指令.

1)没有SA_RESETHAND | SA_NODEFER:这似乎将系统置于逻辑陷阱中:在“Q”处,应生成SIGSEGV.但SIGSEGV在信号处理程序中被阻止(默认的sigaction行为).如何继续执行?会冻结吗?它是否会超越违规指令(我猜不是)?

2)使用SA_RESETHAND | SA_NODEFER:我想在这种情况下,当重复SIGSEGV时,程序将以“正常”方式崩溃.

3)只有SA_NODEFER:我想在这种情况下,递归调用信号处理程序;如果SIGSEGV总是重复,我们会冻结,直到堆栈溢出,然后是什么.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值