当前位置: 首页 > news >正文

Linux 信号机制--最终章-信号处理

一、信号处理的核心问题

进程收到信号后,不会立即处理,而是在“合适的时候”才处理。这个“合适的时候”就是:

进程从内核态返回用户态之前

为什么是这个时候?因为:

  • 信号处理函数是用户代码,必须在用户态执行

  • 内核不能直接执行用户代码(否则就跳过了权限检查)

  • 所以必须等进程准备返回用户态时,内核“顺便”检查一下有没有信号要处理

二、三张表的关系

作用可修改性
block记录哪些信号被屏蔽可用sigprocmask修改
pending记录收到了哪些信号只能读取,不能直接修改(由内核自动置位/清零)
handler记录每个信号的处理方式可用signal修改

为什么 pending 表不能直接修改?
因为 pending 是内核的“待办事项清单”,由内核根据事件自动填写。如果用户能随意修改,就可以伪造信号,破坏系统安全。但是我们也有修改的方式,那就是我们前面讲的5种产生信号的方式

三、特殊信号

信号编号特性
SIGKILL9不可被捕捉、不可被屏蔽、不可被忽略
SIGSTOP19不可被捕捉、不可被屏蔽、不可被忽略

这两个是“管理员信号”,必须执行默认动作。

四、信号处理时机详解

4.1 正常流程

用户态进程执行 ↓ 调用系统调用(或发生中断/异常) ↓ 进入内核态,执行内核代码 ↓ 系统调用完成,准备返回用户态 ↓ 内核检查当前进程的 pending 表 ├─ 如果没有信号 → 直接返回用户态 └─ 如果有信号 → 进入 do_signal()

可以理解成:

4.2 do_signal() 的处理逻辑

void do_signal() { for (每个 pending 中的信号) { if (信号被 block) continue; switch (handler[signo]) { case SIG_IGN: // 忽略:只清 pending 位 clear_pending(signo); break; case SIG_DFL: // 默认动作:可能是终止、停止等 default_action(signo); break; default: // 自定义捕捉:最复杂的情况 setup_user_handler(signo); break; } } }

五、自定义捕捉的详细过程

5.1 为什么要复杂?

因为:

  • handler 是用户代码,必须在用户态执行

  • 但 handler 执行完后,还要回到内核,再由内核返回用户态的原代码

  • 这需要在用户栈上“模拟”一次函数调用

5.2 具体步骤

假设进程正在执行main函数,调用read系统调用时收到信号:

用户栈布局(简化): ┌──────────────┐ 高地址 │ main 的栈帧 │ ├──────────────┤ │ read 系统调用 │ ← 当前执行点 └──────────────┘ 低地址

第 1 步:进入内核

  • 进程执行read→ 陷入内核

  • 内核完成read工作,准备返回

第 2 步:发现有信号要处理

  • 内核检查 pending,发现 SIGUSR1 有自定义 handler

第 3 步:内核在用户栈上构造“假栈帧”

新的用户栈布局: ┌──────────────┐ 高地址 │ main 的栈帧 │ ├──────────────┤ │ 原返回地址 │ ← 保存的 main 返回点 ├──────────────┤ │ handler 参数 │ ← signo ├──────────────┤ │ handler 返回地址│ ← 指向 __sigreturn ├──────────────┤ │ handler 栈帧 │ └──────────────┘ 低地址

第 4 步:修改程序计数器

  • 内核修改进程的上下文,让 CPU 返回用户态时直接执行 handler

  • 栈顶指向 handler 的栈帧

第 5 步:执行 handler

  • CPU 在用户态执行 handler 代码

  • handler 执行完毕,执行ret指令

  • 因为栈上放的是__sigreturn的地址,所以 CPU 跳转到__sigreturn

第 6 步:__sigreturn 重新进入内核

  • __sigreturn是一个特殊的系统调用

  • 它再次陷入内核,告诉内核“信号处理完了,恢复原进程”

第 7 步:内核恢复原上下文

  • 内核把之前保存的 main 上下文恢复

  • 返回用户态,main 继续执行

六、为什么不能让内核直接执行 handler?

绝对不能

如果内核直接执行用户代码:

  1. 用户可以在 handler 里写rm -rf /

  2. 内核以最高权限执行 → 系统被破坏

  3. 跳过了所有权限检查

所以必须:

  • 内核准备环境

  • CPU 切回用户态执行 handler

  • handler 执行完再切回内核清理

七、中断与信号的类比

特性硬件中断信号
触发源外部设备内核/其他进程
编号中断号信号编号
处理表中断向量表(IDT)handler 表
处理函数内核提供用户提供
执行环境内核态用户态

本质区别

  • 中断是硬件机制,用于 CPU 与外设交互

  • 信号是软件机制,用于进程间通信和异常通知

可以把信号理解为软件模拟的中断

八、中断控制器的作用

外设1 ──┐ 外设2 ──┼── 中断控制器 ── CPU 外设3 ──┘

为什么需要中断控制器?

  • CPU 的引脚很宝贵,不能每个外设都直接连

  • 中断控制器负责:

    • 收集多个外设的中断

    • 给每个中断分配唯一的中断号

    • 按优先级向 CPU 报告

九、总结流程

硬件中断/异常/系统调用 ↓ 进程进入内核态 ↓ 执行内核代码 ↓ 准备返回用户态 ↓ 检查 pending 表 ├─ 无信号 → 直接返回用户态 └─ 有信号 → do_signal() ├─ 默认/忽略 → 直接处理,返回用户态 └─ 自定义 → 构造用户栈,修改上下文 ↓ 返回用户态执行 handler ↓ handler 执行完 → __sigreturn 重新进入内核 ↓ 内核恢复原上下文 ↓ 返回用户态,原代码继续
http://www.jsqmd.com/news/462152/

相关文章:

  • SeqGPT-560m轻量生成模型性能测试:CPU环境实测
  • Whisper-large-v3优化指南:提升小语种识别准确率的实用技巧
  • 2026天然石选购攻略:口碑厂家不容错过,天然石/砌墙石/脚踏石/文化石/贴墙石/冰裂纹/蘑菇石,天然石品牌口碑排行 - 品牌推荐师
  • 【物联网实战01】基于鸿蒙Hi3861的WiFi舵机控制器:实现手机远程物理开关灯与插排
  • 2026年热门中式服装加盟品牌排行,看看有哪些值得选!,杭州中式服装加盟推荐推荐排行榜综合实力与口碑权威评选 - 品牌推荐师
  • mPLUG-Owl3-2B多模态应用:跨境电商独立站A/B测试图效果归因分析
  • 性价比高的白蚁防治消杀公司推荐 江西保格利价格贵不贵 - 工业推荐榜
  • 0.91寸IIC单色OLED屏幕(SSD1306)驱动移植与显示应用实战
  • Renesas CS+ for CC新手避坑指南:解决‘iodefine.h‘缺失和中断符号错误
  • Ostrakon-VL-8B模型原理浅析:初学者也能懂的Transformer与ViT
  • 天津靠谱陪诊机构怎么选?一文看懂避坑技巧,优质选择推荐 - 品牌排行榜单
  • Pi0低成本具身智能方案:Pi0+树莓派摄像头+开源机械臂DIY实践
  • Rocky Linux 9快速部署Docker与Oracle 11g数据迁移实战
  • DCT-Net模型在Ubuntu系统下的部署与性能优化
  • 梳理寒假美术培训班哪家合适,靠谱机构价格全解析 - mypinpai
  • 为什么你的边缘推理模型总在编译阶段失败?:解析libc++/musl/microSTL三大轻量标准库的ABI兼容性雷区
  • 轻量级Web界面打造本地AI服务:Ollama Web UI Lite完全部署指南
  • Youtu-Parsing模型推理服务监控与告警系统搭建
  • iPad串流全屏终极指南:Moonlight+虚拟显示器完美适配2048x1536分辨率
  • ChatGPT指令学术实战:如何构建高效科研辅助工具链
  • 解决cosyvoice中AttributeError: module ‘ttsfrd‘ has no attribute ‘ttsfrontendengine‘的技术分析与实践
  • 智慧农业新突破:YOLO12 WebUI实现作物生长监测
  • 突破账号验证壁垒:PrismLauncher-Cracked带来的Minecraft离线游戏革命
  • 免费使用!霜儿-汉服-造相Z-Turbo镜像快速上手与创作案例分享
  • 如何通过数据接口整合解决金融数据获取难题?探索AKShare的一站式解决方案
  • ClearerVoice-Studio高性能:1分钟音频平均处理耗时仅18秒(RTF=0.3)
  • ChatGPT卡顿优化实战:从请求排队到并发处理的架构演进
  • 金融数据接口开发实战:从需求分析到场景落地的完整解决方案
  • GPT-OSS-20B效果实测:210亿参数模型在16GB设备上的惊艳表现
  • Janus-Pro-7B助力Java后端开发:构建企业级AI内容审核微服务