linux信号的概念

news2024/11/18 12:37:31

目录

1.预备

2.信号如何产生

1.引入

2.原理

3.总结

3.接口

1.singal函数

2.kill函数

3.raise函数(给自己发信号)

4.abort函数(给自己发送6号信号)

4.异常

1.现象

2.原理

5.core和term区别

6.由软件条件产生信号

3.信号如何保存

1.原理

2.接口

3.代码运用

4.信号的处理

1.信号是什么时候被处理的?

1.重新谈地址空间:

2.操作系统的本质

3.用户态和内核态的切换


1.预备

1.进程必须能够识别+处理信号,也要具备处理信号的能力,这是属于进程内置功能的一部分。

(也就能说明进程即便没有收到信号,也知道哪些信号是如何被处理的!)

2.当进程真的收到这个信号,进程可能并不会立即处理这个信号。

3.当一个信号产生到信号开始被处理,就一定会有时间窗口,进程具有临时保存信号以及哪些信号被处理的能力

2.信号如何产生

1.引入

ctrl+c为什么能够杀死我们的进程?本质是接受到了我们的2号信号:

我们一般只用到前31的信号,称为普通信号(有时间窗口,不一定收到信号后要立即处理,可存储一定时间)。后面的信号是实时信号,就是收到就要理科处理的信号。

但是如果我们./process & 

linux中,一次登陆中,一个终端一般会配上一个bash,每一个登陆,只允许一个进程是前台进程,可以允许多个进程是后台进程----相当于只有前台进程可以获取键盘的输入。

2.原理

键盘是如何输入给内核的?ctrl+c又是如何变成信号的?

键盘被摁下,肯定是OS先知道的,那OS怎么知道键盘上有数据了?cpu不可能不停的就去检测键盘,有没有去写东西给文件,这样太浪费。而是键盘写入文件时,直接给cpu发送中断,(根据冯诺依曼结构说,cpu不可以直接访问键盘文件,但是键盘可以给cpu发送数据,因为cput上面有很多引脚,是直接连接这cpu的)然后cpu通过接送到的数据到内存的中断向量表中寻找读取键盘的方法,然后将键盘上的数据读取到键盘(文件)的缓冲区中,然后就是read等函数的事情了!

3.总结

信号产生的方式:无论信号如何产生最终一定是谁发送给进程的?OS!为什么?OS是进程的管理者!

3.接口

1.singal函数

第二个handler就是函数指针,实现接受到该信号的时候,进程该做什么。(但是并不是所有的信号都可以被修改)

这样我就可以通过这个函数中的ctrl是不是产生2好信号!

 就有人好奇了?在signal函数的第一个参数就知道是几号信号了!为什么函数指针要加这个参数,因为这个函数指针不一样只代表一个信号的函数指针,里面可能有其他信号的处理方式switch函数方式!

前31个信号只有9号和19号信号是不能通过signal改变,因为一个是杀死进程和暂停进程,如果可以修改的话,那病毒一些东西不就可以执行了吗?

2.kill函数

3.raise函数(给自己发信号)

ctrl + \相当于3号信号

4.abort函数(给自己发送6号信号)

可以看出abort()函数里面不仅有6号的信号!

4.异常

1.现象

但是如果我们通过signal函数修改改信号:

2.原理

而每次调度改进程,该溢出标志位都是1,OS就会发送给pcb中断信号,但是我们自己设计的信号处理方式没有退出,然后就调用其他进程,再次调用该进程时,还是会这样,所以只能死循环!

其实野指针也是一样的:

但是OS是如何识别是溢出还是访问越界呢?其实就是寄存器的不同给OS识别的!

上面这两个都是cpu硬件产生异常,给OS识别到的,有没有软件条件?---管道

但不是所有的异常都会将进程给杀掉:

5.core和term区别

man 7 signal  :

还记得父进程要等待子进程结束的waitpid函数吗?
进程等待-wait和waitpid-CSDN博客

而这上面的core dump就和这个有关!

可是core dump都是0啊,其实和下面有关:

可以将其修改(你如果再改回去,再改的话就不可以,应该是OS不允许这么随意修改吧。)

打开系统的core dump功能,一旦进程出异常,OS会将进程在内存中的运行信息,给我dump(转储)到进程的当前目录(磁盘)形成core.pid文件:核心转储(core dump)

而该core.pid文件可以存储哪一行代码出问题了:

可为什么系统要将这个core给删除掉呢?其实你看到到core.pid文件的大小便会明白了,很大。就想异常一开始的现象,如果一直像那样死循环,那整个系统岂不是可能会崩掉?得不偿失!

6.由软件条件产生信号

SIGPIPE是一种,SIGALRM也是一种:

也可以让他一直发送:

返回值:当一个alarm函数没有到时间,但收到了该信号,返回的就是上一个alarm还剩下多少秒。

3.信号如何保存

1.原理

基础概念:

在进程task_struct结构中存在两个整数,一个数组,block和pending自然是整形,用位图来表示每个信号的。block就是是否屏蔽某个信号,pending则表示是否收到该信号,handler就是收到该信号的处理方法!其中SIG_DFL(default)就是默认处理方法,SIG_IGN(ignore)就是忽略的处理方法,User Space就是自定义了。

一样和上面myhandler一样是函数指针:

2.接口

上面得知这些信号存储在位图中,操作系统肯定不会让我们直接去改变位图的,因为操作系统不相信我们,这肯定的!所以,就提供给我们一个结构体,然后通过函数来初始化他们!

当运用玩这些函数,至此对操作系统的信号位图是一点都没有触碰到呢!

相当于修改上面的block的位图:

int how:SIG_BLOCK(增加该信号屏蔽他,mask = set | mask)SIG_UNBLOCK(删除,mask = mask & ~set, SIG_SETMASK,直接覆盖)

oldset则是修改前set拷贝给oldset。

获取当前pending中的位图,再运用的上面的sigismember函数就能得知该进程是否接受到了该信号了!

改变信号的处理方法,上面已经说过了:signal

3.代码运用

一样,如果全屏蔽掉,那岂不是不能收到信号?和上面一样9和19好信号不可以收到!

4.信号的处理

1.信号是什么时候被处理的?

       当我们的进程从内核态返回到用户态的时候,进行信号的检测和处理。(比如:调用系统调用--操作系统是自动会做“身份”切换的,用户身份变成内核身份,或者反着来;int 80 从用户态陷入内核态(下面会说))

1.重新谈地址空间:

用户页表:有几个进程,就有几个用户级页表---进程具有独立性

内核级页表:只有1份

每个进程看到的3-4GB(内核空间)是一样的,整个系统中,进程再怎么切换,3,4GB空间的内容是不变的!!!

进程视角:我们调用系统中的方法,就是在自己的地址空间中执行的。

操作系统视角:任何一个时刻,都有进程执行。我们想执行操作系统的代码,可以随时执行。

2.操作系统的本质

基于时钟中断的一个死循环。

其实我们应该想过,我们修改这些位图的信号,那进程怎么知道的?OS告诉它的,那OS又怎么知道的?

计算机硬件中,有一个时钟芯片,每个很短的时间,向计算机发送时钟中断!

3.用户态和内核态的切换

但是有人回想,那我们正常程序,就打印点东西,循环,不用系统调用函数,也进入不了内核态啊。cpu在运行进程时是一个一个进程单独运行的,不可能同时运行两个进程,所以进程都是先跑一会,给其他进程跑一会。当这个进程第二次被调度时,从就绪队列转换成运行队列,操作系统把该进程的PCB,寄存器,页表等等放到cpu上,则肯定时内核态,但是运行你普通代码时,肯定是用户态----这不是转换了嘛!

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

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

相关文章

P8661 [蓝桥杯 2018 省 B] 日志统计

[P8661 蓝桥杯 2018 省 B] 日志统计 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路:双指针,对日志按时间从小到大进行排序。快指针指向的 i d id id点赞数加一,快慢指针做差得到之间的时间间隔,大于等于 k k k将慢指针指向…

preg_replace漏洞e模式函数执行

关于PHP函数preg_replace \e 模式函数执行漏洞 preg_replace: ​ 该函数执行一个正则表达式的搜索和替换。 ​ 语法: mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit -1 [, int &$count ]] )​ 搜索…

摘花生c++

题目 Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。 地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的…

【海贼王的数据航海:利用数据结构成为数据海洋的霸主】探究二叉树的奥秘

目录 1 -> 树的概念及结构 1.1 -> 树的概念 1.2 -> 树的相关概念 1.3 -> 树的表示 1.4 -> 树在实际中的运用(表示文件系统的目录树结构) 2 -> 二叉树概念及结构 2.1 -> 二叉树的概念 2.2 -> 现实中的二叉树 2.3 -> 特殊的二叉树 2.4 ->…

【软考】单元测试

目录 1. 概念2. 测试内容2.1 说明2.2 模块接口2.3 局部数据结构2.4 重要的执行路径 3. 测试过程2.1 说明2.2 单元测试环境图2.3 驱动模块2.4 桩模块 4. 模块接口测试与局部数据结构测试的区别 1. 概念 1.单元测试也称为模块测试,在模块编写完成且无编译错误后就可以…

数据库(mysql)-新手笔记(主外键,视图)

数据库基本知识点- http://t.csdnimg.cn/CVa9e 主外键 主键(唯一性,非空性) 主键是数据库表中的一个或多个字段,其值唯一标识表中的每一行/记录。 唯一性: 主键字段中的每个值都必须是唯一的,不能有两个或更多的记录具有相同的主键值 非空性&#x…

Ajax (1)

什么是Ajax&#xff1a; 浏览器与服务器进行数据通讯的技术&#xff0c;动态数据交互 axios库地址&#xff1a; <script src"https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> 如何使用呢&#xff1f; 我们现有个感性的认识 <scr…

【Python-Docx库】Word与Python的完美结合

今天给大家分享Python处理Word的第三方库&#xff1a;Python-Docx。 什么是Python-Docx&#xff1f; Python-Docx是用于创建和更新Microsoft Word&#xff08;.docx&#xff09;文件的Python库。 日常需要经常处理Word文档&#xff0c;用Python的免费第三方包&#xff1a;Pyt…

【自制操作系统】系统启动流程,工具使用和启动区的制作

&#x1f4dd;本文介绍 本文主要从系统系统的启动流程开始&#xff0c;中间介绍一些所用工具的使用方法&#xff0c;最后将完成一个启动区的制作。此次的启动区只涉及到汇编代码。 &#x1f44b;作者简介&#xff1a;一个正在积极探索的本科生 &#x1f4f1;联系方式&#xff1…

《MySQL实战45讲》课程大纲

1MySQL实战45讲-01基础架构&#xff1a;一条SQL查询语句是如何执行的&#xff1f;2MySQL实战45讲-02日志系统&#xff1a;一条SQL更新语句是如何执行的&#xff1f;3MySQL实战45讲-03事务隔离&#xff1a;为什么你改了我还看不见&#xff1f;4MySQL实战45讲-04深入浅出索引&…

vue3 ref获取子组件显示 __v_skip : true 获取不到组件的方法 怎么回事怎么解决

看代码 问题出现了 当我想要获取这个组件上的方法时 为什么获取不到这个组件上的方法呢 原來&#xff1a; __v_skip: true 是 Vue 3 中的一个特殊属性&#xff0c;用于跳过某些组件的渲染。当一个组件被标记为 __v_skip: true 时&#xff0c;Vue 将不会对该组件进行渲染&am…

Springboot——JSR303校验

1. 请求参数的合法性校验 使用基于JSR303的校验框架实现&#xff0c;Springboot提供了JSR-303的支持&#xff0c;它就是spring-boot-starter-validation&#xff0c;他包括了很多的校验规则&#xff0c;只需要在模型中通过注解指定校验规则&#xff0c;在Controller方法上开启校…

map和set(二)——AVL树的简单实现

引入 二叉搜索树有其自身的缺陷&#xff0c;假如往树中 插入的元素有序或者接近有序&#xff0c;二叉搜索树就会退化成单支树&#xff0c;时间复杂度会退化成O(N)&#xff0c;因此 map、set等关联式容器的底层结构是对二叉树进行了平衡处理&#xff0c;即采用平衡树来实现。简…

深入了解二叉搜索树:原理、实现与应用

目录 一、介绍二叉搜索树 二、二叉搜索树的基本性质 三、二叉搜索树的实现 四、总结 在计算机科学中&#xff0c;数据结构是构建算法和程序的基础。其中&#xff0c;二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09;作为一种常见的数据结构&#…

从新手到高手:一站式 SQL Server 学习平台!

介绍&#xff1a;SQL Server是由微软公司开发的关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;自1989年推出以来&#xff0c;已成为全球主流的数据库之一。以下是对SQL Server的详细介绍&#xff1a; 易用性与可伸缩性&#xff1a;SQL Server以其易用性和良好的…

题目:泡澡(蓝桥OJ 3898)

问题描述&#xff1a; 解题思路&#xff1a; 图解&#xff1a;&#xff08;以题目样例为例子&#xff09; 注意点&#xff1a;题目的W是每分钟最大出水量&#xff0c;因此有一分钟的用水量大于出水量则不通过。 补充&#xff1a;差分一般用于对一段区间每个元素加相同值&#x…

arp 代理配置示例

一、应用场景&#xff1a; 当 R1 和 R3 配置静态路由下一跳为接口的时候&#xff0c;让 R2 充当 arp 代理&#xff0c;允许 R1、R3 互访 二、拓朴如下&#xff1a; 三、配置代码&#xff1a; [R1] ip route-static 10.1.23.0 255.255.255.0 GigabitEthernet0/0/0[R2] interf…

Git学习笔记(流程图+示例)

概念 图中左侧为工作区&#xff0c;右侧为版本库。Git 的版本库里存了很多东西&#xff0c;其中最重要的就是暂存区。 • 在创建 Git 版本库时&#xff0c;Git 会为我们自动创建一个唯一的 master 分支&#xff0c;以及指向 master 的一个指 针叫 HEAD。&#xff08;分支和HEAD…

服务器又被挖矿记录

写在前面 23年11月的时候我写过一篇记录服务器被挖矿的情况&#xff0c;点我查看。当时是在桌面看到了bash进程CPU占用异常发现了服务器被挖矿。 而过了几个月没想到又被攻击&#xff0c;这次比上次攻击手段要更高明点&#xff0c;在这记录下吧。 发现过程 服务器用的是4090…

【数据结构】详解时间复杂度和空间复杂度的计算

一、时间复杂度&#xff08;执行的次数&#xff09; 1.1时间复杂度的概念 1.2时间复杂度的表示方法 1.3算法复杂度的几种情况 1.4简单时间复杂度的计算 例一 例二 例三 1.5复杂时间复杂度的计算 例一&#xff1a;未优化冒泡排序时间复杂度 例二&#xff1a;经过优化…