linux 异常信号处理,在Linux中接收SIGINT和异常处理

假设我们在C中有一个使用sleep()函数的程序

该程序执行并进入睡眠状态。然后,我们输入Ctrl+ C将SIGINT信号发送到该进程。

我们知道接收到SIGINT时的默认操作是终止该进程,我们也知道每当睡眠进程收到信号时,sleep()函数都会恢复该进程。

我的教科书上说,为了允许sleep()函数返回,我们必须安装一个SIGINT处理程序,如下所示:

void handler(int sig){

return; /* Catch the signal and return */

}

...

int main(int argc, char **argv) {

...

if (signal(SIGINT, handler) == SIG_ERR) /* Install SIGINT handler */

unix_error("signal error\n");

...

sleep(1000)

}

虽然代码看起来很简单,但是如果我想更深入地研究,我仍然有疑问:

背景:当进程处于hibernate状态时,我们键入Ctrl+ C发送SIGINT

问题1:我的理解是,内核通过更新在插入位向量中SIGINT的对应挂起位将SIGINT发送到进程,我的理解正确吗?

问题2:处理器检测到SIGINT的存在,但是由于我们覆盖了处理程序以使其返回而不是终止进程,因此我们的处理程序被执行,然后内核清除SIGINT的对应挂起位,我的理解正确吗?

Q3-由于SIGINT的相应挂起位被清除,那么sleep()函数如何返回?我认为应该仍然处于睡眠状态,因为从理论上讲,sleep()函数无法知道SIGINT的存在(已清除)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值