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. 将非可靠信号对应的比特位更改为1
    在这里插入图片描述

  2. 添加sigqueue节点到sigqueue队列当中,如果当队列中已经有该信号的sigqueue的节点,则不添加。
    在这里插入图片描述

3.2可靠信号注册

  1. 将可靠信号对应的比特位更改为1
  2. 添加sigqueue节点到sigqueue队列当中,如果当队列中已经有该信号的sigqueue的节点,则继续添加。

4.信号的注销

4.1非可靠信号注销

  1. 将该信号的sigqueue节点从sigqueue队列当中进行出队操作
  2. 信号在sig位图当中对应的比特位从1置位0

4.2可靠信号注销

  1. 将该信号的sigqueue节点从sigqueue队列当中进行出队操作
  2. 判断sigqueue队列中是否含有相同sigqueue节点,有则不会更改sig位图,没有则将sig为置0;

5.信号的处理

三种方式:

  1. SIG_DFL :默认处理方式

  2. SIG_IGN :忽略处理

  3. 信号自定义信号处理方式

与僵尸进程联系的补充: SIGCHLD信号为忽略处理,联系我们之前学习的进程相关知识:子进程先于父进程退出,父进程来不及回收子进程的相关资源,导致子进程成为僵尸进程。
现在学习完信号后我们可以更具体的说法:子进程先于父进程退出,子进程会给父进程发送一个SIGCHLD信号,父进程确实收到了子进程发送的信号,但是父进程忽略处理该信

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值