信号是操作系统提供的一种异步机制,用于向进程发送特定事件的通知。进程需要具备处理信号的能力,即在任何时刻能够捕获和处理信号。
2.1 信号处理流程
信号捕捉包括以下步骤:
sigreturn()
,恢复保存的上下文并返回内核态。https://blog.csdn.net/w903414/article/details/109802539
https://www.cnblogs.com/gnuemacs/p/14311120.html
2.2 核心代码实现
uint pending_signals; // 待处理信号的位图
void* signal_handlers[NSIG]; // 信号处理函数数组
struct trapframe *signal_tf; // 信号处理时保存的用户上下文
uint handling_signal; // 当前正在处理的信号
usertrap()
中添加信号检测:if (p->pending_signals && !p->handling_signal) {
handle_signals();
}
handle_signals()
负责识别待处理信号,调用 deliver_signal()
保存上下文并执行信号处理。
deliver_signal()
中:signal_tf
。sigreturn()
系统调用,恢复上下文并清除信号处理标记:if (p->signal_tf) {
memmove(p->trapframe, p->signal_tf, sizeof(struct trapframe));
kfree(p->signal_tf);
p->signal_tf = 0;
}
p->handling_signal = 0;