1. 信号通信概述

信号是操作系统提供的一种异步机制,用于向进程发送特定事件的通知。进程需要具备处理信号的能力,即在任何时刻能够捕获和处理信号。


2. 信号处理实现

2.1 信号处理流程


https://blog.csdn.net/w903414/article/details/109802539

https://www.cnblogs.com/gnuemacs/p/14311120.html

2.2 核心代码实现

  1. 进程控制块扩展 在进程控制块中添加信号相关的成员变量:
uint pending_signals;         // 待处理信号的位图
void* signal_handlers[NSIG];  // 信号处理函数数组
struct trapframe *signal_tf;  // 信号处理时保存的用户上下文
uint handling_signal;         // 当前正在处理的信号

  1. 信号检测与处理usertrap() 中添加信号检测:
if (p->pending_signals && !p->handling_signal) {
    handle_signals();
}

handle_signals() 负责识别待处理信号,调用 deliver_signal() 保存上下文并执行信号处理。

  1. 上下文切换与栈帧准备deliver_signal() 中:
  1. 信号处理函数返回 实现 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;