Linux Signal 处理

本文探讨了Linux信号如何中断进程的用户空间执行,并详细解释了signal frame如何保存上下文。在kernel返回user mode时,会检查是否有待处理的signal。当TIF_SIGPENDING标志被置位,do_signal()会被调用来处理信号。在do_signal()中,通过handle_signal()函数开始处理信号,中断原本的执行流程。同时,setup_return()函数用于设置return frame,使得在用户空间返回后,会先执行信号处理程序,从而中断原执行路径。

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

最近对以前看过的linux kernel 之signal做了温习,觉得有必要记录下来。


如何理解signal 是对当前进程执行过程的中断?

  • signal对当前进程的中断是指对其user space执行过程的中断,这与signal被处理的时机密切相关。signal的处理是从do_signal()进入,其调用流程:ret_to_user()/ret_fast_syscall–>work_pending()–>do_notify_resume()–>do_signal()。

    do_signal被调用flow

    可以看到,当kernel返回user mode时会去check是否有signal需要处理: 如果TIF_NEED_RESCHED有被置位thread_info->flag,则表示需要进行进程调度,进入work_resched。之后会进入 do_notify_reume接口,判定是否需要进行signal处理,如果TIF_SIGPENDING有置位,后面会进入do_signal()流程。下面是work_pending的实现代码:

work_pending:
*tbnz x1, #TIF_NEED_RESCHED, work_resched
/* TIF_SIGPENDING, TIF_NOTIFY_RESUME or TIF_FOREIGN_FPSTATE case */
mov x0, sp // ‘regs’
enable_irq // enable interrupts for do_no

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值