【Linux】信号(一)

信号我们将从信号产生,信号的保存,信号处理分别进行讲解~

至少大思路是这样。开始之前还要进行一些基础知识的铺垫。

目录

  • 从生活中提炼一些结论:
  • 信号概念的一些储备:
  • 信号产生:
    • 一、kill指令:
    • 二、键盘组合键:
    • 三、系统调用:
    • 四、软件条件:
    • 五、异常:

从生活中提炼一些结论:

a. 信号在生活中随处可以产生------比如红绿灯,天空打雷…
b. 我可以识别识别这些信号-----虽然我可能在课堂中,但是并不妨碍我认识
c. 当信号产生了,该如何进行处理------比如我知道红灯亮了不能走,绿灯亮了可以走
d. 我在做别的更重要的事,对到来的信号暂时不做处理

我上段阶段中的“我”换为“进程”,“生活”换为“OS”就是我们的信号了!

但是仅仅有了上边的概念还不够,还要进行一些补充
对于a,信号的产生与进程是异步的
对于b,c说明进程可以识别并处理信号
对于d,其一:进程需要记住这个事。其二:进程需要再合适的时候在去处理。

信号概念的一些储备:

这里会涉及到我们刚刚提到的信号产生,信号保存,信号处理,先分别涉及一点点,在详细的进行解释。

异步:
那么怎样理解异步?异步就像是在课堂上,老师让一个学生去拿快递,如果老师在等待那个学生过来就是同步,不等待直接进行讲课就是异步。
你拿你的快递,我将我的课,互不干扰

信号:
是linux提供的一种,向指定进程发送发送特定实践的方式。


我们基于以上的两点先来看一看!到底信号是个啥?
使用kill -l命令即可看到linux中的全部信号。
1到31号是普通信号,超过31是实时信号,我们不进行考虑1
在这里插入图片描述我们写个如下程序,并对其发送9号信号(相信我们目前都用过的一个信号,相对来说也是最熟悉的)在这里插入图片描述
发现果然被kill了
在这里插入图片描述
上图其实就是一个进程对信号进行处理的一个例子,我们就以这个为切入点进行信号处理的渗透。

信号处理常用的有3种方式
a. 默认动作
b. 忽略动作
c. 自定义动作

对于a:进程处理信号都是默认的,通常包括终止,暂停,忽略…
下图中框起来的就是默认动作,Core与Term其实都代表终止,但具体的区别我们等等在谈。
在这里插入图片描述

对于b:忽略就是忽略的意思

对于c:那么就不得不提我们的signal函数了
在这里插入图片描述
这是一个对信号进行捕捉的系统调用,捕捉后收到该信号就会去执行自定义的操作。

我们来用代码具体实践一下
在这里插入图片描述
执行指令
在这里插入图片描述
现象:没有执行默认动作,而是执行我的自定义动作,并且ctrl + c也终止不了!
在这里插入图片描述
结论
我们handler函数中的函数其实就是发送的信号,2号信号就是ctrl + c, strl + c就是向进程发送2号新号!

那么此刻我想问几个问题:
1 如果没有产生信号呢
2 我们捕捉更多的信号呢

对于问题一:没有产生新的信号就代表是正常运行
对于问题二:我们进行捕捉多个信号,进行测试。

对2 3 4进行测试,仍然是和我们预期一致:收到信号会执行我们的自定义函数,但真的是这样吗?对于这点我们待会有验证。

其实此时我们就可以总结出两个信号产生的方式

  1. kill
  2. 组合键

我们如何理解信号的发送与保存?
这里只是浅度的认识一下,毕竟我们也说了这只是一些对产生,保存,处理的一些预备知识。

先来看保存:
详细细心的小伙伴以经发现我们的信号是从1开始,31结束,没有0。为什么呢?

这里就到回到进程了,进程是task_struct结构体,结构体中有成员变量,在这些变量中有一个uint32_t 的类型变量(名字不准确却能反映出关键)
这个无符号整形有0000 0000 0000 0000 0000 0000 0000 000032个零。
我们使用位图对这32位比特位进行利用!

当发送信号1时就将1号比特位置为1,
0000 0000 0000 0000 0000 0000 0000 0010
发送2时就将2号比特位置为1
0000 0000 0000 0000 0000 0000 0000 0100
以此类推。

发送:
我们修改指定的PCB中的信号位图即可!
将0置为1,所以发信号貌似叫做写信号更合适。

但是这里有个要注意的点,OS是软硬件资源的管理者,PCB是一个内核数据结构,理所应当的只有OS有权利进行写入,所以OS才有资格进行修改。

信号产生:

这里在强调一下,我们现在刚刚结束预备知识的部分。
在这里插入图片描述

我们已经得出了两点结论。

一、kill指令:


二、键盘组合键:

ctrl+c。
ctrl+c是我们最常用的,但不是唯一一个组合键,还有一个ctrl+\,也是让进程终止的组合键。


三、系统调用:

说到系统调用那必然要提到一个接口在这里插入图片描述
其实看到这个命令我们大概也能想到kill指令其实也就是由这个调用来的。
那我们来模拟一下kill指令。
在这里插入图片描述

进行测试,果然如此。
在这里插入图片描述


再来看另外一个系统调用raise。
在这里插入图片描述
本质上是对kill的封装,对调用此函数的进程发送你指定的信号。
在这里插入图片描述
现象:被捕捉后就去执行我们的自定义代码随后死循环->和我们预期一样。
在这里插入图片描述


再来看一个系统调用:
abort:
在这里插入图片描述
与raise是一样的,不过这个是指定发送6号信号。
在这里插入图片描述
但是要注意一点:虽然允许捕捉,但仍然会终止,是我们常用的3种处理方式例外。

现在我们有两个问题:
一:把信号全部捕捉会怎样?
二:如何理解发送?

对于1:我打个for循环全部捕捉即可~
在这里插入图片描述
当我们尝试9时就会发现虽然在代码中捕捉了,但是实际上是不允许的,不然如果你真的全捕捉那岂不是反了天了??哈哈。
但实际上除了9还有别的指令也和9一样,不允许捕捉。

对于二:只是为了再次强调,是OS进行发送信号,修改PCB中的位图。


四、软件条件:

一个很抽象的名词。

我们来举一个例子。
在管道阶段我们知道当读端关闭,写端继续写入就会被OS发送SIGPIPE信号。
那么和软件条件有什么关系的?
在这里插入图片描述
管道的产生条件是与struct file内核缓冲区等具有非常紧密的关系的,他们都是软件,当当读端关闭,写端继续写入就会不满足软件条件,最终导致13号信号的发送。

这时候我们就有需要认识一个新的函数了
在这里插入图片描述
闹钟函数。
我们先来看一看这函数
a54660e44698f3f445c80838cc7.png)

现象:
在这里插入图片描述

这实际上是14号新号。
在这里插入图片描述
现象:果然收到了14号新号
在这里插入图片描述
现在有了以上的基础我们要谈论3个子问题
a. 理解一下IO成本
b. 理解alarm
c. alarm的返回值

对于a,我们其实很好验证,
在这里插入图片描述
稍微修改一下代码即可观察到现象
在这里插入图片描述
11w到9亿,足以看到IO的速度是非常慢的。

对于b,
在理解之前我们要先说另一个话题,我们肯定经历过手机断电还几天或者电脑,但是开机之后仍然可以保持标准的时间,这是由于我们的电子设备内置了一个纽扣电池,帮助我们计时。
而闹钟可以准时提醒我们是根据一个时间戳的东西。

我们理解一个事物往往需要一个切入角度:而这个角度往往都是先描述在组织,我们有那么多进程,每个进程都可能有一个闹钟,那么就需要先描述则个闹钟。
在这里插入图片描述
这个结构体内有各种各样的描述闹钟的变量。

那我们选择什么进行组织呢?
当我们要寻找一个没有超时的闹钟时,只要找到最后一个超时的后一个就可以了
我们可以采用有序链表,但这样太慢了,所以我们最终选择堆!每次pop时就是当前的最小堆,观察是否超时即可!

对于3:我们在设一个闹钟进行观察。
在这里插入图片描述

在这里插入图片描述
当把sleep改为4时
在这里插入图片描述
由此我们可以得出结论:返回值是闹钟剩余的时间。

而我们alarm(0)本质上就是取消闹钟,因为它实际上没有什么意义。

那我们设置一个alarm(2),也是取消上一个闹钟,在重新设置一个。

注意:闹钟默认是触发一次的,
在这里插入图片描述
虽然设置了多个但是只会触发一个,因为每次设置都是对上一次的闹钟的取消。
在这里插入图片描述

那我们如何设置一个闹钟一直触发?
答:在捕捉函数里在设置一个即可,也叫做常设闹钟。

五、异常:

关于异常我们一定遇到过,真的是太经典了…
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/682622.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BP 客户主数据-国际贸易条款发生更改

Issue :ECC升级S4后 1)客户主数据扩产线时(LHGX03),国贸条件2变更记录查询时,所扩产线(30 1C)无变更记录,未变更产线(10 1C/1H/1M)确认变更记录 20230108新增&#xff1…

生命在于学习——Python人工智能原理(3.2)

三、深度学习 (二)人工神经网络 人工神经网络是模仿人类大脑神经系统工作原理所创建的数学模型,有并行的分布处理能力、高容错性和自我学习等特征。 1、感知器 感知器由Frank Roseblatt于1957年提出,是一种广泛使用的线性分类…

Matlab解决矩阵微分方程建模(代码开源)

#用matlab解决施密特正交规范化矩阵之后,我又想到矩阵的微分方程计算量真的太大了,来回转化让我头大,于是我尝试了一下用matlab建立模型来解决这类问题。 代码部分如下:注解还挺清晰的: %%%解微分方程组%eg&#xff…

多目标优化-NSGA-II

文章目录 一、前置知识NSGA-II帕累托前沿 二、算法流程1.NSGA2.NSGA-II 一、前置知识 1.NSGA(非支配排序遗传算法):旨在同时优化多个冲突的目标函数,寻找帕累托前沿上的解集。 什么是多个冲突的目标: 比如你看上了一辆车,你既想要它便宜,又…

一个思维狂赚20万+?揭秘电商平台隐藏的流量认知!

你想要的流量,资源,人脉,都已经有人为你准备,你只需要找到拥有这些资源的人。对于流量和信息,也是一样,你想找的客户和产品,都已经有人为你准备在淘宝、拼多多等电商平台,你只需要找…

掌握Postman,轻松调试POST与GET接口:详细安装与实战教程,让你的API测试更高效

0.前言 在确保数据接口的稳定性和可访问性方面,使用专业的接口测试工具至关重要。这些工具不仅简化了测试流程,还提供了无需编写额外代码即可轻松调用和调试接口的能力,从而大大提高了测试效率和准确性。 0.1 Postman 背景介绍 用户在开发或…

遭遇Device Association Service占用CPU和内存过高异常

1.异常描述 在蓝牙设备搜索和配对过后,系统界面卡住了,查找了下任务管理器,发现有一个主机服务占用了过多的CPU和内存,且不断的在增长。截图如下: 百度查了下,Device Association Service是一个Win10系统服…

HCIP-Datacom-ARST自选题库_10_多种协议多选【24道题】

1.如图所示,PE1和PE2之间通过LoopbackO接口建立MP-BGP邻居关系,在配完成之后,发现CE1和CE2之间无法互相学习路由,下列哪些选项会造成该问题的出现? PE1或PE2未在BGP-VPNV4单播地址族视图使能邻居A PE1或PE2上的VPN实例参数配置错…

JVM的内存结构

JVM 内存结构 方法区: 方法区主要用于存储虚拟机加载的类信息、常量、静态变量,以及编译器编译后的代码等数据。 程序计数器 由于在JVM中,多线程是通过线程轮流切换来获得CPU执行时间的,因此,在任一具体时刻,一个CP…

2.1.3 采用接口方式使用MyBatis

实战概述:使用MyBatis的接口方式进行数据库操作 环境准备 确保项目中已经集成了MyBatis框架。 创建用户映射器接口 在net.huawei.mybatis.mapper包中创建UserMapper接口。定义方法findById(int id)用于按编号查询用户。定义方法findAll()用于查询全部用户。定义方法…

[沫忘录]MySQL InnoDB引擎

[沫忘录]MySQL InnoDB引擎 逻辑存储结构 InnoDB采用 “表、段,区, 页、行” 这样的层级结构进行存储。 **表空间(tablespace)**ibd文件,主要用于存储记录、索引等数据,一个mysql实例可有多个表空间,甚至能通过innodb…

代理IP科普:IP黑名单与IP白名单的机制与作用

在IP代理使用中,我们经常听到黑名单与白名单两个名词,它们不仅提供了强大的防御机制,还可以灵活应对不同的安全威胁。本文将详细探讨IP黑名单和白名单在网络安全中的双重屏障作用。 一、IP黑名单和白名单定义 IP黑名单与IP白名单是网络安全中…

WPF中Window的外观实现及常用属性

文章目录 1. 概要2. Window的外观2.1 Window的外观组成2.2 Window的实现2.3 Window外观配置2.4 Window 的其他常用属性1. AllowsTransparency 2. WindowStartupLocation3. ShowInTaskbar4. ShowActivated5. SizeToContent6. Topmost7. WindowStyle 1. 概要 和 Android 类似, W…

C语言笔记第13篇:自定义类型(联合union和枚举enum)

1、联合体 1.1 联合体类型的声明 像结构体一样,联合体也是由一个或多个成员构成,这些成员可以是不同的类型。 但是编译器只为最大的成员分配足够的内存空间,联合体的特点是所有成员共用一块内存空间,所以联合体也叫&#xff1a…

计算机发展史 | 从起源到现代技术的演进

computer | Evolution from origins to modern technology 今天没有参考资料哈哈 PPT:(评论区?) 早期计算工具 算盘 -算盘是一种手动操作的计算辅助工具,起源于中国,迄今已有2600多年的历史,是…

【Python】常见的第三方库及实例

各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 库介绍 Python是通过模块来体现库&#xff0…

数据结构--双向链表

目录 一.链表的分类 二.双向链表的结构 三.双向链表的实现 1.初始化 2.尾插与头插 3.尾删与头删 4.在指定位置之后插入数据 查找函数 5.删除指定节点 6,销毁链表 四.完整代码 List.h List.c 一.链表的分类 链表的结构⾮常多样,以下情况组合起…

C++第三方库【httplib】断点续传

什么是断点续传 上图是我们平时在浏览器下载文件的场景,下载的本质是数据的传输。当出现网络异常,浏览器异常,或者文件源的服务器异常,下载都可能会终止。而当异常解除后,重新下载文件,我们希望从上一次下载…

python-01

第一个程序 import randomcomputer random.randint(1, 3) print(电脑出的是:, computer) i int(input(你要出什么?1代表石头,2代表剪刀,3代表布\n)) if i computer:print(平局) elif (computer 1 and i 3) or (computer 2 …

React@16.x(20)渲染流程-首次渲染

目录 1,渲染的前置知识点1.1,React 元素1.2,React 节点1.3,节点类型1.4,真实DOM 2,首次渲染2.1,根据参数创建节点2.2,不同节点,有不同处理2.3,生成虚拟DOM树2…