Linux——进程信号
1.信号的概念
信号是一个软件中断
共有62种信号,通过kill -l
查看所有信号
其中:
- 1~31号为非可靠信号,信号有可能会丢失
- 34~64号为可靠信号,信号不会丢失
2.信号的产生
2.1硬件产生
- ctrl + c :2号信号(SIGINT),导致前台进程终止
- ctrl + z :20信号(SIGTSTP),导致前台进程暂停
- ctrl + l :3号信号(SIGQUIT),与SIGINT类似,单会产生Core Dump(核心转储)文件
2.2什么是Core Dump?
core dump 又叫核心转储,是一个程序运行时的环境一个集合包,包含崩溃时的堆栈信息,是一个二进制文件,无法使用记事本打开,一般会在指定目录下生成一个core文件。core文件仅仅是一个内存映象,主要用来调试。
文件的生成和大小限制?
- linux系统more默认关闭coredump文件的生成,因为需要占用一部分系统开销。
ulimit -c
检查系统core
dump功能是否开启,0为关闭
产生核心转储文件的条件?
- 当前的操作系统当中一定不要限制coredump文件的大小
ulimit -c 1024
产生核心转储文件的情况?
- 解引用了空指针,进程就会收到11号信号,导致进程coredump
- 内存访问越界,一旦进程崩溃,进程就会收到11号信号,也就会理论上产生coredump文件
- double free进程会收到6号信号,导致当前的进程退出,并产生coredump
2.2软件产生
1.,kill命令语句
kill -[信号]-[pid]
2.kill函数
kill(pid_t pid,int signo)
向pid进程发送signo信号,成功返回0,错误返回-1
3.abort函数
void abort(void);
向pid发送6号信号,像exit函数一样,abort函数总是会成功的,所以没有返回值
3.信号的注册
1个位图+1个singqueque队列
sigset_t在taskstruct体中的存储:
在使用sig数组不是数组来使用的,而是按照bit位来使用的,long在linux下占64个比特位,每一个信号在位图中都有一个与之对应的比特位,当与之对应的比特位为1时,表示当前进程收到了该信号
3.1非可靠信号注册
-
将非可靠信号对应的比特位更改为1
-
添加sigqueue节点到sigqueue队列当中,如果当队列中已经有该信号的sigqueue的节点,则不添加。
3.2可靠信号注册
- 将可靠信号对应的比特位更改为1
- 添加sigqueue节点到sigqueue队列当中,如果当队列中已经有该信号的sigqueue的节点,则继续添加。
4.信号的注销
4.1非可靠信号注销
- 将该信号的sigqueue节点从sigqueue队列当中进行出队操作
- 信号在sig位图当中对应的比特位从1置位0
4.2可靠信号注销
- 将该信号的sigqueue节点从sigqueue队列当中进行出队操作
- 判断sigqueue队列中是否含有相同sigqueue节点,有则不会更改sig位图,没有则将sig为置0;
5.信号的处理
三种方式:
-
SIG_DFL :默认处理方式
-
SIG_IGN :忽略处理
-
信号自定义信号处理方式
(与僵尸进程联系的补充: SIGCHLD信号为忽略处理,联系我们之前学习的进程相关知识:子进程先于父进程退出,父进程来不及回收子进程的相关资源,导致子进程成为僵尸进程。
现在学习完信号后我们可以更具体的说法:子进程先于父进程退出,子进程会给父进程发送一个SIGCHLD信号,父进程确实收到