一、基本的概念
1、中断
中断概念:中止、暂停当前正在执行的进程,转而去执行其它的任务。
硬中断:来自硬件设备的中断
软中断:来自其它程序的中断
2、信号
信号是一种软中断,可以把他看作是进程与进程、内核与进程通信的一种方式,它为进程的异步执行,提供了技术支持。
3、常见的信号
SIGINT(2) 终端中断信号Ctrl+c
SIGQUIT(3) 终端退出信号Ctrl+/
SIGABRT(6) 调用abort函数产生的信号
SIGFPE(8) 算术信号
SIGKILL(9) 死亡信号
SIGSEGV(11) 段错误信号
SIGALRM(14) 闹钟信号
SIGCHLD(17) 子进程结束信号
SIGCONT(18) 进程继续信号
SIGSTOP(19) 进程暂停信号
SIGTSTP(20) 终端停止信号
4、不可靠信号(非实时)
1、编号小于SIGRGMI(34)的信号都是不可靠的,这些信号是建立在早期的信号机制上的,一个事件发生可能会产生多次信号。
2、不可靠信号不支持排队,在接收信号的时候可能会丢失,如果一个发给一个进程多次,它可能只接收到一次,其它的可能就丢失了。
3、进程在处理这种信号的时候,哪怕设置的信号处理函数,当信号处理函数执行完毕后,会再次恢复成默认的信号处理方式。
5、可靠信号(实时)
1、位于[SIGRGMI(34),SIGRTMAX(64)]区间的都是可靠信号。
2、可靠信号支持排队,不会丢失。
3、无论是可靠信号还是不可靠信号都是通过:kill、signal、sigqueue、sigaction进行处理。
6、信号的来源
硬件来源:
键盘:Ctrl+c、Ctrl+/、Ctrl+z
驱动:硬件设备被激活、使用、失效。
内存:非法访问内存。
软件来源:
命令:kill、killall
函数:kill/raise/alarm/setitimer/sigqueue。
7、信号的处理方式
1、忽略
2、终止
3、终止+core
core dump 把内存的使用情况扔出来。
core文件是一种二进制文件,需要一些高度工具才能解析出来(gdb)。
1、gcc -g code.c -> 生成带调试信息的可执行文件。
2、运行可执行文件产生core文件
3、gdb ./a.out core 程序会停止在产生错误的位置。ubuntu默认不产生core的,需要使用命令设置:
ulimit -c unlimited
4、捕获并处理