Linux信号机制学习卡片

📶
信号的定义与作用
定义
信号是进程间通信(IPC)的一种方式,用于通知进程某个特定事件已经发生
作用
  • 读取信号的二进制代码并重新处理
  • 用于系统异常处理进程控制等多种场景
  • 当进程收到信号后,需要对该信号进行相应的处理

📌 记忆提示:信号就像进程间的"短信通知"

🔢
Linux信号类型
  • Linux定义了30种符合POSIX标准的信号
  • SIGINT(2):终端按下Ctrl+C触发,默认终止当前进程 ⚠️
  • SIGFPE(8):浮点异常(如除以0),默认终止进程并转储内存
  • SIGKILL(9):强制杀死进程,不能被捕获或忽略 ☠️
  • SIGSEGV(11):无效内存引用(段错误)
  • SIGCHLD(17):子进程停止或终止
  • SIGSTOP(19):停止进程直到收到SIGCONT

📌 记忆提示:9号信号(SIGKILL)最强大,无法被阻挡

💾
信号实现原理
存储结构
  • pending位向量:记录已收到但未处理的信号
  • blocked位向量:记录被屏蔽的信号类型(信号掩码)
信号容量
N种信号需要N位向量
信号覆盖规则
同类型信号后到达的会被丢弃(pending仅用1bit记录)

📌 记忆提示:pending是"待办事项",blocked是"勿扰模式"

📨
信号发送与处理
发送函数
kill(pid_t pid, int sig):向指定PID进程发送信号
处理时机
当进程从内核态转为用户态时(如系统调用返回、中断处理返回)
处理检测算法
  1. 对blocked位向量按位取反(~blocked)
  2. 与pending向量逐位与运算(pending & ~blocked)
  3. 结果为非零的位对应信号需要处理

📌 记忆提示:kill不是杀死,而是"发送信号"

⚙️
信号处理方式
默认处理
  • 终止进程(如SIGINT)
  • 终止并转储内存(如SIGFPE)
  • 忽略(如SIGWINCH)
自定义处理
  • 用户可通过系统调用覆盖默认处理程序
  • 处理完成后对应pending位自动清零
  • 限制:SIGKILL和SIGSTOP不可阻塞或自定义

📌 记忆提示:9号和19号信号是"终极武器",无法自定义

信号重要特性
  • 仅用1bit记录同类信号→重复信号被丢弃
  • 同时收到多信号时按序号从小到大处理
  • 进程可独立设置阻塞信号和自定义处理程序
  • 不同OS对信号类型的定义不同(Linux有30种POSIX标准信号)
  • 信号与异常的关系:
    • 内核捕获异常后发送对应信号(如除零→SIGFPE)
    • 完全由内核处理的异常(如缺页)不触发信号

📌 记忆提示:信号是异常处理的"邮递员"

1 / 6