信号(Signal)
信号为异步事件通知机制,用于控制流管理、唤醒可中断睡眠、传达错误(如 SIGPIPE)。
- 源码:
os/src/ipc/signal.rs - 相关:调度器/等待队列、任务管理
概念与目标
- 异步:可在目标任务不主动配合的情况下投递“待处理事件”。
- 可中断:中断阻塞型系统调用/等待,返回中断错误码,交由上层恢复或重试。
- 默认动作:对部分信号可定义缺省行为(忽略、终止等,具体以实现为准)。
关键组成
- 待处理队列/位图:每个任务维护“待处理信号”集合。
- 屏蔽/处理:任务可设置屏蔽集与(可选的)处理方式;未处理时采用默认动作。
- 派发点:陷入返回(trap return)或显式检查点派发并执行处理逻辑。
常见语义
- 投递:根据目标(任务/进程)查找对象,将信号标记为待处理并尝试唤醒。
- 唤醒:若目标处于“可中断睡眠”,立即从等待队列移出并返回中断错误。
- SIGPIPE:对无读者管道写入时由管道模块触发。
- 不可屏蔽/强制:如
SIGKILL之类(若实现)绕过屏蔽直接生效。
与调度/等待队列
- 可中断睡眠通过
WaitQueue实现,中断路径在唤醒后返回特定错误码,由上层重启或终止操作。
使用建议
- 将信号用于控制流与唤醒;不要在信号处理上下文做复杂/阻塞操作。
- 对可重启的阻塞调用,收到中断错误后按需重试。