一、基本概念
1、中断
当程序接收到消息后中止当前正在执行的程序,转而执行其它任务,等其它任务执行完成后再返回,这种执行模式叫做中断
分为硬件中断和软件中断
2、信号
是一种软件中断,由操作系统发出,程序接收后会执行相应的操作
3、常见的信号
命令 kill -l 查看所有信号
SIGINT(2) Ctrl+c 终止
SIGQUIT(3) Ctrl+\ 终止+core
SIGFPE(8) 除零 终止+core
SIGKILL(9) 终止信号 终止 不能捕获、忽略
SIGSEGV(11) 非法访问内存 终止+core
4、不可靠信号和可靠信号
建立在早期的信号处理机制上(1~31)的信号是不可靠信号
不支持排队、可能会丢失,如果同一个信号连续产生多次,进程可能只相应了一次
建立在新的信号处理机制上(34~64)的信号是可靠信号
支持排队、信号不会丢失
5、信号的来源
硬件异常:除零、非法访问内存、未定义的指令、总线错误
软件异常:通过一些命令、函数产生的信号
6、信号的处理方式
1、忽略
2、终止进程
3、终止进程并产生core文件(记录内存映像)
4、停止
5、继续
6、捕获并处理 (在信号发生前,先向内核注册一个函数,当信号来临时系统会自动执行该函数)
二、信号捕获
typedef void (*sighandler_t)(int);
功能:说明信号处理函数的格式
sighandler_t signal(int signum, sighandler_t handler);
功能:向内核注册一个信号处理函数
signum:信号编号
handler:函数指针
也可使用以下参数
SIG_IGN 忽略
SIG_DFL 按默认方式处理
返回值:
之前的信号处理方式
注意:
1、SIGKILL(9)、SIGSTOP(19)信号不能被捕获和忽略处理
2、当信号处理完后可能会返回产生信号的代码继续运行,如果我们捕获并处理段错误、算术异常等信号可能会产生死循环,正确的处理段错误、算数异常信号应该是备份数据并直接结束程序