信号处理函数的调用过程

信号处理函数的调用过程

Content #

信号处理函数的调用过程是由来自操作系统内核的软中断触发的,因此,这个过程与我们平时见到的,通过 call 指令进行的函数调用过程并不相同。

信号处理的例子:

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
void sigHandler(int sig) {
  printf("Signal %d catched!\n", sig);
  exit(sig);
}
int main(void) {
  signal(SIGFPE, sigHandler);
  int x = 10;
  int y = 0;
  printf("%d", x / y);
}

围绕信号的基本交互逻辑可以被粗略地描述为以下几个步骤:

  1. CPU 执行除法指令 idiv;
  2. 发现除零异常,CPU 暂停当前程序运行,并将控制权转交给操作系统;
  3. 操作系统将信号 SIGFPE 发送给出错的程序;
  4. 操作系统根据情况执行相应的信号处理程序(函数);
  5. 信号处理程序执行完毕后,若程序未退出,则将程序执行恢复到之前的中断点,即 CPU 会重新执行 idiv 指令。

Viewpoints #

From #

15|标准库:信号与操作系统软中断有什么关系?