触发流程

  • 进入系统调用,用户态变成内核态
  • 是对应触发信号

内核态在返回用户态时,看到有信号标记,然后修改栈和指令寄存器让cpu去执行对应函数。

sleep(1)这是一个系统调用,进入内核后休眠。Ctrl+C 按下时:

1. 内核标记信号 pending
2. sleep 因为信号被中断,返回 EINTR
3. 内核在返回用户态之前,看到有 pending signal
4. 内核在用户栈上压入一个伪造的返回地址(指回原代码)
5. 修改栈/指令寄存器,让 CPU 执行 on_signal
6. on_signal 返回时,内核帮你 sigreturn,恢复原来的上下文
7. 代码继续跑 while(running) 检查条件

1