Linux——信号(1)

在我们使用Linux系统的时候我们经常会使用ctrl + c的方式来终止进程,也
会使用kill命令来杀掉进程,评判进程退出的健康程度中也有信号的身影。那
么Linux中的信号到底是什么?今天就由我来介绍Linux中的信号。

1. 信号的概念

要了解计算机中的信号,首先要认识生活中的信号。在我们的生活中,信号时时刻刻在我们的身旁:早起响的闹钟、上下课铃声,起跑时的枪令、过马路时的红绿灯等等,这些都是我们所能够接触到的信号。
在这里插入图片描述
那我们对这些信号的认知应该是什么样子的呢?
首先就是我们应该认识它们知道它做出行为之后知道它的意思是什么,我们知道我们的行为将是什么
那就意味着,我们在收到这个信号前,我们就已经知道这个信号的处理方式了(比如我们幼儿园时常教的红灯停绿灯行)。
信号的到来,我们并不清楚是什么时候,信号到来相对于我现在的工作是异步产生的(比如起跑时的枪令)。
信号到来时,我们并不一定要立即处理它,我们会在合适的时候处理(比如正在打游戏的时候,我们的外卖来了)。
那这也意味着我们要有一种存储这个已经到来的信号的能力
以上就是对信号的认识,而计算机中的信号也同样是遵循着以上规律:
在这里插入图片描述
我们的Linux中就存在着这样的一张列表存储着Linux系统中所有的信号。而上面规律中的“我们”在计算机中指向的就是进程。稍后我会介绍Linux中是如何体现信号的规律的。
现在我们就能得出Linux中信号的定义:
信号是向目标进程发送消息的一种机制。

2. 信号的产生

a. 关于进程的一些指令

当我们运行这样一段代码时:
在这里插入图片描述

在这里插入图片描述
我们会发现,当我们向命令行中输入命令时,shell并没有做出任何反应。这是因为Linux中只能有一个前台进程,对于前台进程我们可以使用ctrl + c终止前台进程来让我们的命令输入再次有效:
在这里插入图片描述
我们也可以将前台进程切换成后台进程,让我们的命令可以使用:
在这里插入图片描述
其中让进程后台运行的方式就是在后面加个取地址符号。
我们可以使用jobs查看后台进程:
在这里插入图片描述
可以使用fg + 后台进程编号,将该进程切换为前台进程:
在这里插入图片描述
可以看到我们的命令行中输入的命令又没有作用了。
我们也可以使用ctrl + 暂停前台进程,但是由于Linux中前台进程只能有一个,所以我们需要将暂停的进程切换到后台然后使用bg + 编号继续运行:
在这里插入图片描述
那这段时间我们的shell去了哪里?其实操作系统会在我们执行前台进程,终止前台进程的过程中,将shell不停的从前后台中进行切换。而判断一个进程是否是前台进程的依据之一就是这个进程能否有能力接收用户输入。操作系统它本质上也是一个软件,那么操作系统运行软件管理进程,操作系统又由谁来运行呢?这个我们稍后再解释。

b. Linux中信号的灵感

不知道大家有没有想过这么个问题,在我们使用键盘鼠标的时候,计算机怎么就知道我们的键盘中有了数据需要读取呢?难道是采用轮询的方式一直扫描机器的外设看看外设中是否有数据可读?这种方式未免太消耗计算机的时间了。
我们知道计算机中的CPU主要是由两部分组成:运算器和控制器。运算器主要是进行系统的运算,而控制器有一部分作用就是控制外设,CPU中存在着许多带着编号的针脚,这些针脚可以理解为其中一部分直接连接着我们的外设(其中肯定不是直接连接,它们中间还有8259)。这些针脚另一端就是寄存器,当我们的外设有数据输入时,它们会发送信息然后转化为光电信号传给我们的针脚另一端的寄存器中。而这些带有编号的针脚的编号也是有意义的,计算机在启动的时候会生成一张表,这张表中记录了外设的读方法,所以当我们的外设有数据输入时也就是寄存器接收到光电信号时,操作系统会让CPU执行那张表中的对应外设的读方法。而那张表其实也就是一个函数指针数组,而访问对应的外设读方法也就是通过编号作为下标映射来访问。
这种通过外设发送信号给cpu然后操作系统再调用对应的读方法,这种方法叫做中断。
针脚的编号我们叫做中断号,而那张记录对应特定外设的表叫做中断向量表。

在这里插入图片描述
在这里插入图片描述
我们再次观察信号列表,我们会发现它没有32和33号信号。其中1到31号信号成为普通信号,后面的信号称为实时信号。我们主要研究普通信号。
对于普通信号而言,当一个进程收到信号之后,这个进程起码要表示它是否收到了这个信号。那么如何表示呢?它会在进程pcb结构体中维护一个位图:位图的1/0表示信号的有无,位图的位数表示信号的编号,那么有了信号我们还应该知道对应信号的处理方式,而我们的每一个进程也都会有一个函数指针数组,里面记录了收到对应信号的处理方式,而信号的编号也跟这个数组的下表是对应的。
了解以上流程之后,我们发现键盘读数据的方式好像和信号的处理方式有些相似。其实Linux中的信号就是根据中断技术模拟实现的,只不过信号的中断更多是软件层面的。

c. 信号的产生方式

1). 键盘产生

我们所使用的ctrl + c等等我们发现它不会被操作系统识别为简单的输入,而是以组合键的形式输入。其实它们会被处理成信号,例如ctrl + c终止前台进程(对应二号信号),ctrl + z暂停前台进程(19号进程),还有一个ctrl + \终止前台进程(三号信号)。
我们可以验证以上说法:
在这里插入图片描述
我们对于信号的处理有三种方式,默认处理方式,忽略,和自定义处理,而这个signal函数就可以实现自定义处理,它的第一个参数是对应自定义的信号编号,第二个参数是一个函数指针,记录着用户自定义处理的方式。我们可以使用这个函数来验证以上说法:
在这里插入图片描述

我们先用对应的信号分别终止进程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后我们使用组合键终止进程:
ctrl + c
在这里插入图片描述
ctrl +
在这里插入图片描述
ctrl + z
在这里插入图片描述
我们发现组合键终止或暂停程序确实是对进程发送了信号,但是我们也发现19号信号好像没有被修改自定义,这是因为信号中有一些信号是不可被修改的,这样的信号还有9号信号等等。
我们可以使用man 7 signal查看信号的默认行为:
在这里插入图片描述
其中Core和Term一般都是终止进程的意思

2). 系统调用

有一些系统调用也可以产生信号。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
abort:
在这里插入图片描述
这个就是直接终止自己了。对应六号信号
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

raise:
在这里插入图片描述
它可以指定信号让操作系统发送给自己。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

c. 异常

当我们的代码中出现除零或者访问空指针的时候,就会出现错误,操作系统就会给我们发送信号,终止进程:
在这里插入图片描述
在这里插入图片描述
对应我们八号信号。
在这里插入图片描述

对应11号信号。
对于空指针错误来说,我们访问了0地址,那里本来就是不可被访问的,就算能访问,也会由于页表中没有相应的映射从而触发中断引起异常。我们知道cpu中会读取我们地址空间的地址进而将地址空间转化为物理地址再去内存中读取,那么这个转化的过程就由CPU中一个叫MMU的东西来进行,它其中会有一个标志位来记录是否转化异常,如果异常的话,它会置为1,操作系统就会检测到这个标志位然后向该进程发送信号终止该进程。
对于除零错误,为什么会除零错误,原因是数学层面不允许除零,除零无意义,但是计算机是怎么处理的呢?我们的CPU中会有一个寄存器status,它表示了该次运算的健康程度,当除零时它的身上也会有一个标志位,叫做溢出标志位,会被置为1,操作系统得知后它就会给对应进程发送信号终止该信号,那么此时我们就会有一种有意思的现象:
在这里插入图片描述
在这里插入图片描述
我们这个程序中可是没有循环的,但是其中却出现了循环的现象。这是因为我们修改了八号信号的处理方式改为自定义捕的方式,而自定义方式中,并没有直接退出进程。那么本来操作系统当看到status寄存器中的溢出标志位为1之后,就会向该进程发送八号信号终止该进程,然后继续调度其他进程,我们知道进程的调度就是将寄存器中的内容也就是硬件上下文切换为其他进程的。我们并没有退出这个进程,所以当我们再次调度这个进程的时候status寄存器中的溢出标志位仍是1,那么操作系统仍旧会发送八号信号给该进程。这就是为什么会造成循环的原因。
这是硬件方面的异常。还有软件方面的那就是管道,当读端管道关闭之后,写端进程会直接收到操作系统的13号信号而直接关闭。

d. 软件条件

我们上面所谈论的都是程序出了问题之后再终止程序的,但是也有些是不是因为出现问题需要终止进程的,而是特定的做某些事,比如在一个时间段做某些事,那么这时候就有了一个信号:
在这里插入图片描述
14号信号,也就是闹钟,它也有一个接口:
在这里插入图片描述
这个接口的意思就是在进程启动seconds秒之后终止进程(默认)。
在这里插入图片描述
我们的众多进程中可能会有多个进程使用闹钟,那就意味着闹钟也是需要被管理的,管理的方式肯定还是先描述再组织,我们可以大概想想这个结构体中应该会有什么:进程的pid、闹钟的目标时间、等等。我们的时间总要有个参照物,那就是时间戳。那如何管理呢?用链表的形式每秒遍历吗?操作系统不会做这种低效率的事情。所以我们可以采用小根堆的形式,每次只要查看堆顶的时间到了没就可以管理好所有的闹钟了。
而我们利用闹钟也可以发现一些现象:
在这里插入图片描述

在这里插入图片描述
稍加修改:
在这里插入图片描述
在这里插入图片描述
从这其中我们也可以看到与硬件大量交互的速度相比于CPU有多慢了。
以上就是信号产生的几种方式,我们可以看到无论信号以何种方式产生,最终都是由操作系统发送信号给对应进程,这是因为操作系统是进程的管理者。

3. 操作系统运行的原理

我们操作系统可以调度所有进程,运行程序等等一系列工作,那操作系统本身也是一个软件,它也是一个进程啊,它又由谁来运行呢?
其实操作系统它就是一个死循环,它会在做好所有前置准备之后进入死循环,然后开始调度运行其他进程。
在这里插入图片描述
我们前面说了,CPU中有针脚会连接外设利用中断的技术进程外设数据的读取。而还有一个针脚它连接着一个装置,这个装置它又连接着我们的时钟芯片。
我们的电脑在关机几个星期你打开之后它的时间可能还是正确的,那如果你关机几年呢?就不一定了,那为什么我们的电脑关机之后,我们再打开我们的电脑的时间还能是正确的呢?这就是因为我们的计算机中有些设备是有自己的小电源的,类似于时钟芯片它就会有自己的供电方式(一个小的纽扣电池)。
我们上面的装置叫做CMOS,它会根据时钟芯片来以周期的非常高频的时钟中断的方式来一直刺激CPU,它既然连接了针脚,那它就会有对应中断向量表中的读方式,但是这里并不是读的方式,而是操作系统的调度其他进程的方式也就是操作系统的代码,而其中的高频也叫主频也是衡量计算机性能的一个标志。这样我们的的操作系统就会一直被CPU所运行,它是由硬件来催动着它运行的。我们所说的操作系统的前置准备其中有一个就是中断向量表的构建。而这个前置准备也叫做各种中断的陷阱的初始化工作。所以,操作系统的执行是基于硬件中断的
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql在服务器中的主从复制Linux下

mysql在服务器中的主从复制Linux下 为什么要进行主从复制主从复制的原理主从复制执行流程操作步骤主库创建从库创建 测试 为什么要进行主从复制 在业务中通常会有情况,在sql执行时,将表锁住,导致不能进行查询,这样就会影响业务的…

DS:栈和队列的相互实现

创作不易,感谢友友们三连!! 一、前言 栈和队列的相互实现是用两个栈去实现队列或者是用两个队列去实现栈,这样其实是把问题复杂化的,实际中没有什么应用价值,但是通过他们的相互实现可以让我们更加深入地理…

vue的十大面试题详情

1 v-show与v-if区别 v-if与v-show可以根据条件的结果,来决定是否显示指定内容&#xff1a; v-if: 条件不满足时, 元素不会存在. v-show: 条件不满足时, 元素不会显示(但仍然存在). <div id"app"><button click"show !show">点我</but…

(2024,提示优化,监督微调,强化学习,近端策略优化)用于安全生成文本到图像的通用提示优化器

Universal Prompt Optimizer for Safe Text-to-Image Generation 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 相关工作 3. 提议的框架 4. 实验 0. 摘要 文本-图像&a…

软件实例分享,酒店酒水寄存管理系统软件教程

软件实例分享&#xff0c;酒店酒水寄存管理系统软件教程 一、前言 以下软件教程以 佳易王酒水寄存管理系统软件V16.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、寄存的商品名称可以预先设置 2、寄存人可以使用手.机号识别 3、会员充值…

详解4大C语言内存函数【超详细建议点赞收藏】

目录 1. memcpy----内存拷贝1.1 函数介绍1.2 函数使用1.3 模拟实现 2. memmove----重叠内存的数据拷贝2.1 函数介绍2.2 函数使用2.3 模拟实现 3. memcmp----内存比较3.1 函数介绍3.2 函数使用 4.memset----内存设置4.1 函数介绍4.2 函数使用 注意&#xff1a;以下4个内存函数在…

Springboot医院信息管理系统源码 带电子病历和LIS Saas应用+前后端分离+B/S架构

目录 系统特点 技术架构 系统功能 1、 标准数据维护 2、 收费&#xff08;门诊/住院&#xff09;系统 3、 药剂管理系统 4、 医生工作站系统 5、 护士工作站系统 6、电子病历系统 系统优点 云HIS系统简介 云HIS系统功能模块 门急诊挂号管理 门诊收费管理 门诊医…

ansible剧本中的角色

1 roles角色 1.1 roles角色的作用&#xff1f; 可以把playbook剧本里的各个play看作为一个角色&#xff0c;将各个角色打的tasks任务、vars变量、template模版和copy、script模块使用的相关文件等内容放置在指定角色的目录里统一管理&#xff0c;在需要的时候可在playbook中使…

直接选择排序算法

​​​​​​目录 选择排序 SelectSort直接选择排序 整体思路 图解分析 ​ 代码实现 时间复杂度 选择排序 基本思想&#xff1a; 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排…

【SV的面向对象 SV的类_2024.01.02】

OOP术语 OOP&#xff1a;object oriented programming Class类&#xff1a;包含变量和子程序的基本构建块 Object对象&#xff1a;类的一个实例 Handle句柄&#xff1a;指向对象的指针 Property属性&#xff1a;存储数据的变量&#xff1b;在V中&#xff0c;可以是wire或reg类…

NOTA-马来酰亚胺,1295584-83-6,可作为过渡金属离子的配体

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;NOTA-马来酰亚胺&#xff0c;NOTA Maleimide &#xff0c;NOTA-Mal&#xff0c;1295584-83-6 一、基本信息 产品简介&#xff1a;NOTA Maleimide, also known as NOTA maleimide, is a novel bifunctional integrat…

Sora不懂物理世界,翻车神图全网爆笑!LeCun马斯克DeepMind大佬激辩世界模型

大火的Sora&#xff0c;让许多动画、影视行业的人大为恐慌。 不过&#xff0c;今天网上广为流传的这张图&#xff0c;让大家倒是放心了不少。 可以看到&#xff0c;在这个视频中&#xff0c;玻璃杯碎裂的方式十分诡异—— 它被抬到半空中时&#xff0c;桌子上就忽然出现了一滩…

PWM功能介绍 和配置

泰山派默认提供了3组PWM的GPIO &#xff0c; 为了检测PWM的输出&#xff0c;我们可以配合逻辑分析仪来查看效果&#xff0c;或者搭配STC8的LED灯 PWM 测试 列举所有的PWM设备&#xff1a; # 查找所有有pwm名称的文件 find / -name "pwm" # pwm4: pwmfe6e0000 edp屏幕…

【图像分割 2023 WACV】HiFormer

【图像分割 2023 WACV】HiFormer 论文题目&#xff1a;HiFormer: Hierarchical Multi-scale Representations Using Transformers for Medical Image Segmentation 中文题目&#xff1a;HiFormer:基于Transformer的分层多尺度表示医学图像分割 论文链接&#xff1a; 论文代码&a…

解决updatexml和extractvalue查询显示不全

报错注入是一种常见的SQL 注入方式&#xff0c;通过注入代码&#xff0c;触发数据库的错误响应&#xff0c;并从错误信息中获取有用的信息。 updatexml和extractvalue updatexml和extractvalue 是常用的两个报错注入函数 http://localhost/sqli/Less-5/?id1%27and%20updat…

Maxwell - 增量数据

前言 今天来学习一个新的大数据小工具 Maxwell &#xff0c;它和 Sqoop 很像。Sqoop主要用于在 Hadoop &#xff08;比如 HDFS、Hive、HBase 等&#xff09;和关系型数据库之间进行数据的批量导入和导出&#xff0c;而 Maxwell 则主要用于监控数据库的变化&#xff08;通过监控…

如何使用Docker部署Drupal并结合cpolar实现固定公网地址访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…

2024年及以后在您的项目中使用的最佳CSS框架

在过去几年中&#xff0c;CSS已经取得了长足的进步。在过去&#xff0c;您可能会使用CSS来创建依赖于HTML表格和CSS浮动作为其布局系统的简单外观的Web应用程序。而现在&#xff0c;您可以设计复杂的交互式用户界面&#xff0c;具有优雅的设计。 尽管CSS变得越来越先进&#x…

虚拟机centos7 网络IP冲突

修改其中一个虚拟机IP 1&#xff1a; 设置虚拟机网络配置器的模式为NAT模式&#xff0c;操作方式如下图所示 2&#xff1a;点击虚拟网络编辑器 3&#xff1a;点击NAT设置 4&#xff1a;点击DHCP配置 5&#xff1a; 修改配置文件来指定IP并可以连接到外网&#xff0c;在roo…

【通讯录案例-数据存储总结 Objective-C语言】

一、我们简单的把“数据存储”总结一下, 1.上午,我们说的三种存储方式, 1)plist 2)Preference(偏好设置) 3)NSKeyedArchiver(归档、解档) 三种存储方式, 2.什么能做plist存储, 1)writeToFile:方法, 实际上,这个东西,才是关键, 有一个对象,可以去写w…