【进程信号】什么是信号?


在这里插入图片描述

Ⅰ. 前言

​ 我们下面先引出生活的几个共识:

​ 在我们生活中,信号不外乎就是这些:发令枪、闹钟、红绿灯、消息提醒、手机铃声等等,那我们想一下,以红绿灯为例子,为什么人能够识别红绿灯呢

​ 其实可以将识别分解为 ①认识+行为产生,我们因为有人教育过我们,让我们在大脑中记住了对应的红绿灯的属性,所以知道这是红绿灯,就像那些贫困地区的人可能没去过交通发达的地方,可能没有红绿灯,所以可能不知道红绿灯是什么!而行为识别就是有人教育我们说看到红灯停,绿灯行,相同的,如果识别不出来红绿灯的话,那么可能就不知道红绿灯的意思,就不知道产生什么样的行为!

​ 除此之外,②信号到来的时候,我们不一定要立马去处理这个信号!举个例子,比如我们叫了外卖之后,和朋友正在打游戏,当对手推到高地的时候,外卖小哥突然打电话说让你去拿快递,这就相对于外卖小哥给你发信号,而你此时让外卖小哥等一会,你要把游戏打完再去拿,也就是说信号发过来之后,我们可能不会立即去处理它,可能会将它搁置一会,因为我们可能在做着更重要的事情!

​ 再者,③当信号到来的时候,直到这个信号被我们处理,这个时间段就是一个时间窗口,并且我们需要将其记住!就好比我们叫外卖小哥等待一会,而我们打完之后再去拿外卖,等到拿到外卖之后才算信号处理完,这个时候中间外卖小哥等待的时间就是时间窗口,并且我们必须将这件事记住,免得忘记了外卖和快递小哥!

​ 最后,④信号会产生不同的动作:默认动作、自定义动作、忽略动作!举个例子,我们过马路的时候如果按照我们的共识就是红灯停绿灯行,那么这就是默认动作。但是如果小红麻麻告诉小红,绿灯亮的时候要先跳个舞才能过马路,这个叫做自定义动作。最后忽略动作就像我们在学校,老师布置了作业,那么有些学生是收到了做作业的信号,但是他们把作业给忽略掉了,就是不做作业,这个就叫做忽略动作!

Ⅱ. 什么是信号

信号是进程之间事件异步通知的一种方式,属于软中断

一、进程信号的种类

​ 每个信号都有一个编号和一个宏定义名称,这些宏定义可以在 signal.h 中找到,例如其中有定义 #define SIGINT 2

​ 我们在 linux 中通过 kill -l 指令是可以查看到系统中的进程信号的,一共有 62 种,其中 [1, 31]非可靠信号[34, 64]可靠信号(非可靠信号是早期 Unix 系统中的信号,后来又添加了可靠信号方便用户自定义信号,这二者之间具体的区别在后续内容中会提到)

在这里插入图片描述

​ 编号 34 以上的是 实时信号,这里我们只讨论编号 34 以下的信号,不讨论实时信号。这些信号各自在什么条件下产生,默认的处理动作是什么,可以在 signal(7) 中查询,也就是可以使用命令行指令 man 7 signal 查看!

​ 其中 signal 的概述中我们看到黑色框中圈出来的是接收到信号之后,会执行何种操作!

​ 如 TermCore 分别代表的就是 终止该进程,不一样的是 Core 还会进行 dump core(这个下面会将,其实就是将终止进程的有效信息转化为了日志保存在当前目录下!);而 Ign 表示 忽略该信号,继续干进程自己的事情!StopCont 分别就是 暂停进程继续进程 了(💥需要注意的就是暂停了一个前台进程之后,该进程就变成了后台进程了!)

在这里插入图片描述
在这里插入图片描述

二、如何理解进程信号

​ 有了上面以生活为例的概念,我们如何将其迁移到进程中呢❓❓❓

​ 这里需要先给出一些共识:①信号是给进程发的!就像我们使用 kill -9 pid 一样,就是给 pid 进程发送 9 号信号,而 9 号信号对应的就是杀掉进程的信号!

​ 接着我们来看一下,上面我们说到识别信号分为认识和行为产生,那么对于进程来说,是如何认识信号的呢 ❓❓❓

​ 其实进程本身是被程序员编写的属性和逻辑的集合,也就是说,②进程是由程序员编写完成的,所以进程肯定会认识信号

​ 除此之外,③当进程收到信号的时候,进程可能在执行更加重要的代码,因此该信号不一定会被立刻处理

​ 所以 ④进程本身必须要有对于信号的保存能力,以便执行完代码后转而去处理该信号!

​ 最后,进程在处理信号的时候,一般有三种动作:⑤默认、自定义、忽略。其中处理信号也被称为捕捉信号


​ 下面我们先来讲一下第四点,如果一个进程要保存信号,应该保存在哪里呢❓❓❓

​ 这个根据我们的知识,大概就能猜到是 存放在进程管理块 task_struct 中的,事实上就是这样子的!那么又有问题啦,它是如何保存的呢❓❓❓

​ 可以看到上面进程信号都是通过数字编号来区分的,那么我们大胆猜测一下,在 task_struct 中有一个 unsigned int signal 变量,它的作用相当于是一个 位图结构每个比特位用来标识对应的信号编号,该进程收到了哪个信号编号,signal 就将其对应编号位置的比特位置 1,事实上在设计的时候就是这样子的!这其实我们还能看出来一点,在设计信号的时候,大佬们常常抽象的称是发送信号,但是我们了解了本质以后,其实 发送信号的本质,就是修改 task_struct 中的信号位图

在这里插入图片描述

​ 又因为 task_struct 是由内核维护的数据结构对象,而 task_struct 的管理者是 OS,那么谁有权力修改 task_struct 中的内容呢❓❓❓

​ 很明显就是 OS!所以既然是通过 OS 来管理,所以我们在用户层使用的时候一定要通过 OS 提供给我们的系统调用接口!所以未来我们学习多少种信号的形式,本质都是通过 OS 向目标进程发送的信号

​ 剩下几个点我们在下面讲信号产生等知识时候会涉及到!

三、信号的生命周期

​ 我们后面所讲的进程信号的生命周期都是这样子的:产生 --> 进程中的注册 --> 进程中的注销 --> 捕获处理

​ 或者是另一种说法:预备 --> 信号产生 --> 信号保存 --> 信号处理

​ 我觉得第二种说法会更加的好理解一些,这些我们后面都会讲到!而我们上述所讲的就是产生信号之前的预备知识!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

利刃大大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值