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);
}
围绕信号的基本交互逻辑可以被粗略地描述为以下几个步骤:
- CPU 执行除法指令 idiv;
- 发现除零异常,CPU 暂停当前程序运行,并将控制权转交给操作系统;
- 操作系统将信号 SIGFPE 发送给出错的程序;
- 操作系统根据情况执行相应的信号处理程序(函数);
- 信号处理程序执行完毕后,若程序未退出,则将程序执行恢复到之前的中断点,即 CPU 会重新执行 idiv 指令。