sigint linux,在Linux中接收SIGINT和异常句柄

本文探讨了在C程序中,如何通过自定义SIGINT处理程序来控制休眠进程的中断行为。作者深入解析了内核如何发送SIGINT,处理器的响应过程,以及如何通过返回而非终止来影响sleep()函数的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设我们在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)

}

代码似乎很简单,如果我想深入挖掘,我仍有疑问:

背景:当进程处于休眠状态时,我们输入ctrl-c来发送SIGINT

Q1-我的理解是,内核通过更新挂起位向量中的SIGINT相应的挂起位来向进程发送SIGINT,我的理解是否正确?

Q2-处理器检测到SIGINT的存在,但是因为我们覆盖处理程序以使其返回而不是终止进程,所以我们的处理程序被执行,然后内核清除SIGINT的相应的待处理位,我的理解是否正确?

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值