信号处理
信号处理是信号生命周期中最重要的环节,涉及待处理信号集合、阻塞集合和信号处理函数的执行机制。
pending 集合(待处理信号):内核为每个进程维护一个 pending 位向量,记录已经发送但尚未被处理的信号。当信号到达时,内核在 pending 中设置对应位。
blocked 集合(被阻塞信号):内核为每个进程维护一个 blocked 位向量(信号屏蔽字),记录哪些信号被阻塞不处理。被阻塞的信号在 pending 中标记,但延迟递达,直到解除阻塞后才被处理。
sigprocmask 系统调用:用于修改进程的信号屏蔽字,有三种操作模式:
SIG_BLOCK:将指定信号加入阻塞集合(加法)。SIG_UNBLOCK:将指定信号从阻塞集合移除(减法)。SIG_SETMASK:用指定集合替换当前阻塞集合。
信号处理流程:
- 第一次切换(用户态→内核态→用户态):信号到达时,CPU保存当前程序状态,跳转到信号处理程序执行。
- 第二次切换:信号处理程序执行完毕后,CPU恢复原程序状态,继续执行。
- 信号处理更像微型的进程切换而非函数调用——涉及两次用户态/内核态切换。
可重入与异步信号安全:信号处理程序是异步执行的,调用非可重入函数(如 printf、malloc)可能导致数据结构损坏。信号处理程序应只调用异步信号安全(async-signal-safe)的函数,如 write。
链接到
- 上一个知识点:8.15 接收信号
- 下一个知识点:8.17 非本地跳转