信号处理过程涉及用户态和内核态之间的切换,以及信号掩码(mask)和挂起信号集(pending)的变化。以下是一个典型的信号处理过程,包括用户态和内核态之间的交互,以及信号掩码和挂起信号集的变化:
信号处理过程
信号发送:
- 当一个信号被发送到进程时,内核会将这个信号标记为挂起信号。挂起信号集(pending)中的对应位被设置。
- 如果信号被屏蔽(在信号掩码(mask)中),信号不会立即被处理。
信号检测:
- 在进程从用户态进入内核态时(例如,通过系统调用、异常或中断),内核会检查是否有挂起的信号需要处理。
- 如果有挂起的信号,并且信号没有被屏蔽,内核将准备处理该信号。
切换到信号处理程序:
- 内核会保存当前的进程上下文(寄存器、程序计数器等),以便在信号处理完成后恢复。
- 内核将信号处理程序的地址设置为程序计数器,并将信号处理程序的参数(例如信号编号)传递给处理程序。
- 内核将信号掩码(mask)更新为信号处理程序的掩码,以屏蔽在处理信号期间不需要的信号。
执行信号处理程序:
- 进程切换回用户态,执行信号处理程序。
- 信号处理程序完成后,进程通过系统调用(例如
sigreturn
)返回内核态。恢复上下文:
- 内核恢复进程的上下文,将程序计数器恢复到信号处理程序之前的位置。
- 内核将信号掩码(mask)恢复到信号处理程序执行之前的状态。
信号掩码(mask)和挂起信号集(pending)的变化
- 信号发送:挂起信号集(pending)的对应位被设置。
- 信号检测:如果信号没有被屏蔽(mask),内核准备处理信号。
- 切换到信号处理程序:信号掩码(mask)更新为信号处理程序的掩码。
- 信号处理程序执行完毕:挂起信号集(pending)的对应位被清除,信号掩码(mask)恢复。