文章目录
- 信号的保存
-
- [信号递达(Signal Delivery)](#信号递达(Signal Delivery))
- [信号未决(Pending Signal)](#信号未决(Pending Signal))
- [信号阻塞(Signal Blocking)](#信号阻塞(Signal Blocking))
- [Pending 与 Block 的关系](#Pending 与 Block 的关系)
信号的保存
在 Linux 信号机制中,完整的生命周期通常包括三个阶段:
- 信号产生(Signal Generation)
- 信号保存(Signal Pending / Signal Masking)
- 信号处理(Signal Handling)
此前已经介绍了信号产生的多种方式,例如:
- 硬件异常
- 软件条件
- 键盘输入
- 系统调用(如
kill) - 进程间通信
需要注意的是:
无论信号由哪种方式触发,最终都必须由 操作系统内核 负责向目标进程发送信号。
用户程序并不能直接修改进程控制块(PCB),所有信号操作都必须通过系统调用进入内核完成。
信号递达(Signal Delivery)
定义
当进程实际执行某个信号对应的处理动作时,该过程称为:
信号递达(Signal Delivery)
信号递达可能对应以下几种行为:
- 执行默认处理动作(如终止进程)
- 调用用户自定义信号处理函数
- 执行忽略操作
例如:
text
SIGINT → 执行用户自定义 handler
SIGTERM → 终止进程
上述实际执行处理逻辑的过程,即为 信号递达。
信号未决(Pending Signal)
在 Linux 中,信号并不是在产生后立即被处理。
定义
从信号产生到信号递达之间的状态,称为 未决状态(Pending)。
即:
Signal Generated
↓
Pending (未决)
↓
Signal Delivered
因此,一个信号在系统中可能处于:
- 已产生
- 尚未处理
的状态。
该机制的原因在于: - 进程可能正在执行关键代码
- 内核需要在合适的时机进行信号处理
因此信号会被 暂时保存。
信号阻塞(Signal Blocking)
除了"未决状态"外,Linux 还允许进程主动 阻塞某些信号 。
定义
进程可以通过设置 信号屏蔽字(Signal Mask),使某些信号暂时无法被递达。
如果某个信号被阻塞:
- 当该信号产生时
- 不会立即被处理
- 会一直保持在 Pending 状态
只有在 解除阻塞(Unblock) 后,该信号才可能被递达。
因此信号处理流程可以表示为:
Signal Generated
↓
Pending
↓
(若被阻塞 → 保持 Pending)
↓
解除阻塞
↓
Signal Delivery
阻塞与忽略的区别
在信号处理机制中,阻塞(Block) 与 忽略(Ignore) 是两个完全不同的概念。
阻塞(Block)
特点:
-
信号不会被递达
-
信号会被保存在 Pending 状态
-
解除阻塞后仍然可能被处理
即:Signal Generated
↓
Pending
↓
Blocked
↓
Unblock
↓
Delivered
无信号时仍可设置阻塞
信号阻塞机制 并不依赖于信号是否已经产生 。
也就是说:
- 即使当前没有任何信号
- 进程仍然可以提前设置 阻塞某些信号
当未来这些信号产生时: - 它们将直接进入 Pending 状态
- 不会立即递达。
信号阻塞与进程阻塞的区别
需要区分两个容易混淆的概念:
| 概念 | 含义 |
|---|---|
| 进程阻塞(Process Blocking) | 进程因等待资源进入阻塞状态 |
| 信号阻塞(Signal Blocking) | 进程屏蔽某些信号 |
两者完全不同:
进程阻塞
Running → Waiting → Ready
原因:
-
等待 I/O
-
等待锁
-
等待资源
信号阻塞Signal Masking
作用:
- 控制哪些信号可以被递达
因此:
信号阻塞与进程状态无关。
忽略(Ignore)
忽略是一种 信号处理方式 。
当信号递达时:
-
系统执行的处理动作是 Ignore
因此流程是:Signal Generated
↓
Pending
↓
Delivered
↓
Ignore
也就是说:
忽略是 一种处理结果 ,而阻塞是 一种递达控制机制。
Pending 与 Block 的关系
需要注意:
Pending(未决) 与 Block(阻塞) 是两种完全不同的概念。
| 概念 | 含义 |
|---|---|
| Pending | 信号已经产生但尚未递达 |
| Block | 进程主动禁止该信号递达 |
它们之间可能存在组合关系:
- 未阻塞信号 → 可以递达
- 阻塞信号 → 会保持 Pending