学习系统编程No.23【信号实战】

news/2024/4/20 7:19:38/文章来源:https://blog.csdn.net/weixin_74004489/article/details/130317385

引言:

北京时间:2023/4/23,最近学习状态不怎么好,总是犯困,没精力的感觉,可能是病没有好彻底的原因,也可能是我内心因为生病而认为摆烂理所应当,反正最后导致摆烂,课现在越来越跟不上了,并且刚刚蓝桥杯出成绩了,我肯定不是帮我自己看的,好奇看看而已,哈哈哈!主要是没怎么做题,大多数的时间都花在上课和总结博客上了,但是不怕,来年再战,我们才大一,还有时间,不怕,哈哈哈!所以今天我们就一起来学习一下新知识,有关信号产生等知识!

在这里插入图片描述

深入信号有关知识

在之前的学习中,我们就学习了一些有关信号的知识,例如在谈进程终止的时候,进程的退出码和退出信号,此时进程的退出信号就是我们该篇博客要谈的信号,我们一起深入看看信号是如何产生,如何执行,和如何保存等知识

什么是信号
在日常生活中,存在着大量的信号,特别是随着年龄的增大,我们能明白的信号就越来越多,像基本的红绿灯,闹钟…等,这些就是日常生活中的信号,通过这些信号规范人们的一些行为,所以我们通过这点可以明白,当一个信号没有产生之前,人们就已经拥有了处理该类信号的能力,这个动作是后天培养形成的,不是天生就有的,所以明白,在系统内部也是一样,当操作系统发出某种信号给进程的时候,该进程就拥有了这种信号对应的处理能力,具体原因如下述所说:

Linux系统下查看信号指令:kill -l,得到下图:
在这里插入图片描述
如上图所示,我们明白各种信号都具有相应的编号,并且通过位图有关的知识,此时我们知道,传送信号的本质就是在传送位图结构,通过位图结构的形式,此时就可以通过相应的判断语句和按位与的知识,进行特定的功能设定,如果此时参数携带了对应的信号,那么它就会满足相应信号对应的if语句,此时该参数就可以执行对应if语句中的代码(功能),这样就完成对应的信号被执行,所以这也就是为什么进程拥有处理对应信号的能力,因为本质就是程序员在设计进程的时候,已经就通过相应的判断条件和具体判断条件中的代码将每一个信号进行了编号和设定

信号为什么需要保存
首先,我们要明白,系统内部和日常生活中一样,无时无刻不存在各种信号和执行信号的程序,并且明白,信号是随时产生的,这个信号什么时候产生我们是不知道的,所以在信号产生前,人/程序可能不能立马执行这个信号,因为人/程序此时可能在执行别的信号对应的功能(具体以优先级排序),但是这个信号我们也不能漏掉,等执行完该信号就需要接着执行对应的信号,所以这个信号必须在后序合适的时候被处理,那么此时这个信号就需要被保存起来,这样才能是程序正常运行或者说是生活正常进行,并且明白,信号的产生对于进程来说是异步的,表示的就是信号的产生和进程没有任何关系,信号产生的同时,程序也在执行,而不是程序必须等待相应信号的产生才可以运行

进程该如何管理这些已经产生但未被处理的信号呢?
简简单单,还是先描述,再组织,用位图结构去描述一个信号,并且此时要明白,因为使用位图的结构来表示各种信号,所以发送信号的本质就是写入信号,直接修改特定进程pcb的信号位图中特定的比特位,由0变成1,此时表示的就是对该进程发送了某种信号,所以得出结论,位图结构中比特位的位置表示信号的编号,比特位的内容表示是否收到信号,并且要明白,是只有操作系统可以对该信号进行写入,也就是明白,当操作系统想要对某个进程传输信号的时候,本质上只是对进程pcb上的某位图结构进行修改,具体如下述所说:
具体来说,操作系统通过在目标进程的 PCB 中设置一个名为“信号位图”的数据结构来表示是否有某种特定信号需要被处理。这个位图是一个二进制数组,其中每个比特位表示是否有相应的信号需要被处理。当操作系统向目标进程发送信号时,它会修改目标进程的信号位图来指示有一个或多个信号需要被处理,当目标进程收到信号时,它会检查自己的信号位图以判断是否有该信号需要被处理。如果有,该进程将执行相应的信号处理程序来响应该信号。因此,在操作系统中,通过改变进程 PCB 上的信号位图来表示传递信号。

信号的产生

明白了上述知识,此时信号传递的本质我们就搞定了,接下来,我们就来看看与信号产生有关的知识,首先明白一点,就是当一个信号产生之后,一般有三种处理信号的方式:1.执行默认动作 2.忽略该信号 3.执行自定义动作,就类似于日常生活中,你调了一个闹钟,当这个闹钟响了的时候,你会有不同的执行结果,1.起床 2.继续睡 3.重新设置闹钟,所以同理在操作系统内部,当一个程序收到了信号之后,这个信号可以有不同的执行方式,不一定要按照默认设定的动作执行,如下:使用 signal() 接口,就可以更改对应信号对应的执行动作,实现让信号拥有多种不同的处理方式

具体使用方式:
在这里插入图片描述
头文件:#include<signal.h> 调用方式: sighandler_t signal(int signum, sighandler_t handler);第一个参数signum表示的是特定的信号,第二个参数handler表示的是对应参数执行的自定义处理动作,也就是一个函数指针,通过第二个参数这个函数指针,让对应的信号可以通过该指针找到对应的函数,进而执行该自定义动作,具体代码如下图所示:

运行程序,现象如下所示:

在这里插入图片描述

可以看出,此时当程序再次收到2号信号(也就是Ctrl+c)信号时,并没有让该进程终止,而只是打印了一条语句,也就是我们自定义实现的函数接口,表明,该进程默认的2号信号对应的动作已经成功被signal()接口替换了

键盘产生信号

我们平时在使用键盘进行输入数据的时候,计算机是如何知道我输入的数据是什么呢?此时操作系统是通过按压键盘让CPU产生硬件中断信号的方式,让CPU获取到对应键盘输入的数据,然后进而进行处理和存储,具体如下图所示:

在这里插入图片描述

系统调用接口产生信号

第一个系统调用接口: kill(),功能:向目标进程发送特定的信号,具体使用方式如下图所示:
在这里插入图片描述
头文件:#include<sys/types.h>#include<signal.h>调用方式:int kill(pid_t pid,int sig);此时明白了该接口的使用方式和功能,此时我们就可以自己实现一个终止某个进程的代码了(只要我们将9号信号传递给对应的进程pid就行),具体代码如下:

此时使用了该代码,我们就可以运行该代码,然后将对应的信号(9)传递给一个正在运行的进程,此时就可以直接让这个进程终止,如下图所示:
在这里插入图片描述
此时根据对应的进程pid,使用signal程序中的kill()系统调用接口,此时就可以将对应的9号信号传递给对应的进程,让该进程被终止

第二个系统调用接口: raise(),功能:发送一个指定信号给调用程序,具体使用如下图所示:
在这里插入图片描述
接口调用方式:int raise(int sig);表示的就是向调用该接口的程序发送指定的信号,具体代码如下图所示:

此时上述代码表示的意思就是使用raise()接口循环向该程序中发送2号信号,然后因为我们又使用了signal()接口将2号信号对应执行的默认动作改成了myhandler()函数,所以此时该程序运行起来的现象就如下图所示:一直循环执行handler(),也就是一直获取到2号信号

在这里插入图片描述

第三个系统调用接口: abort(),功能:直接终止一个进程,具体使用方式如下图所示:
在这里插入图片描述

具体代码如下图:

运行现象如下图所示:

在这里插入图片描述

表示当执行完该接口语句的时候,此时程序就退出,导致后面的语句并没有被执行,所以表示当执行了abort()接口后,该进程就随着退出了

软件条件产生信号

字面意思,软件方面的条件,举个例子,我们在之前学习有关匿名管道知识的时候,我们知道,当我们将进程间通信的环境搭建好了之后,两个进程之间完成通信还受到了读写规则的约束,比如,一个进程需要读取数据就必须等待另一个进程向管道文件中写入数据,并且当一个进程的写端被关闭之后,操作系统为了提高效率,就会将对应读端进程给关闭,此时关闭该进程使用的就是13号信号 SIGPIPE ,所以此时的13号信号表示的就是一个软件条件信号,表示的就是有某一个进程不满足对应的条件需要被终止,此时为了终止这个进程,就需要产生对应的软件条件信号去终止它

所以接下来我们认识一下新的软件条件信号,SIGALRM信号和产生该信号的 alarm 接口,具体使用方式如下图所示:

在这里插入图片描述
接口调用: unsigned int alarm(unsigned int seconds); 表示的作用:设定一个闹钟,也就是告诉操作系统在多少秒之后,给当前进程发送一个SIGALRM信号,并且注意:SIGALRM信号的默认处理动作是终止当前进程,具体代码如下所示:

在这里插入图片描述
如上图代码,此时可以让该接口在规定的时间内(1秒)发送一个14号SIGALRM信号给该程序,进而让该进程终止,此时利用这一点,我们就可以计算一下我们的系统在一秒中内可以就算几次,并且可以使用该接口自己设计出一个闹钟,获取到该程序对应剩余闹钟响起的时间,所以14号信号SIGALRM信号就是一个经典的软件条件产生的信号

硬件异常产生信号

硬件异常可以产生信号,例如,当计算机系统的硬盘驱动器出现故障时,它可能会发送一个信号给操作系统来指示发生了错误,类似地,其他硬件组件如内存、CPU等也可能在出现异常情况时向操作系统发送信号,这些信号通常用于告知操作系统需要采取一些措施来解决问题或仅仅是通知用户有问题发生,这也就是为什么野指针问题,访问越界问题最终程序会崩溃,本质就是因为收到了一定的信号,该信号会导致程序终止

在这里插入图片描述

总结:有关信号产生的知识如上述所说,剩余知识我们下篇博客见啦!

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

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

相关文章

android之 Launcher改造仿桌面排版的效果

一&#xff0c;背景 1.1 新接手一个灯光控制项目&#xff0c;其页面和效果还是比交复杂的&#xff0c;其中一个功能就是仿苹果桌面来排版灯具&#xff0c;支持拖拽&#xff0c;分组&#xff0c;分页。 拖动图标的时候判断是否空白位置还是已经有占位了&#xff0c;有的话就把…

体验了多款国产类ChatGPT产品后,我选择了道合顺的【ChatIC】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后端的开发语言A…

springboot实用配置

springboot实用配置 &#xff08;一&#xff09;打包与运行&#xff08;二&#xff09;配置高级1.临时属性设置2.配置文件分类3.自定义配置文件 &#xff08;三&#xff09;多环境开发&#xff08;四&#xff09;日志1.日志基础2.日志输出格式控制3.日志文件 &#xff08;一&am…

14、RPC与gRPC

目录 一、rpc基础1 - rpc入门2 - 基础的rpc通信3 - 基于接口的RPC服务 二、rpc编码1 - gob编码2 - json on tcp3 - json on http&#xff08;待补充&#xff09; 三、prtotobuf编码1 - prtotobuf概述2 - protobuf编译器3 - 序列化和反序列化4 - 基于protobuf的RPC&#xff08;待…

vue项目 解决el-table自适应高度,vue页面不显示多条滚动条,超出的部分让el-table内部出现滚动条(推荐使用第二种解决方案)

一、需求 后台管理系统&#xff1a;最常见的页面都是由—>左侧菜单、头部tabView页签、主体数据渲染页面&#xff08;AppMain&#xff09;&#xff1b;而一般AppMain页面又分为&#xff1a; 搜索区域、table数据&#xff08;分页&#xff09;&#xff0c;可能也会存在底部&a…

QGIS数据可视化学习笔记01——一般的图层样式调整和在地图上添加图表

说明&#xff1a;QGIS数据可视化章节用的数据为QGIS绘制一张地图学习章节的数据&#xff0c;传送门&#xff1a;https://blog.csdn.net/qq_47188967/article/details/130196284 一、 一般的图层样式调整 首先呢&#xff0c;在QGIS中打开上一章节用的数据&#xff0c;界面如下&…

基于飞桨 PaddleVideo 的骨骼行为识别模型 CTR-GCN

main.pysame_seedsparse_argsmain ensemble.pyconfigs 文件夹Joint&#xff08;J&#xff09;的配置文件ctrgcn_fsd_J_fold0.yamlctrgcn_fsd_J_fold1.yaml Joint Angle&#xff08;JA&#xff09;的配置文件ctrgcn_fsd_JA_fold0.yaml paddlevideo 文件夹utils 文件夹__init__.p…

MATLAB符号运算(七) 更新中...

目录 1、实验目的&#xff1a; 2、实验内容&#xff1a; 1、实验目的&#xff1a; 1&#xff09;掌握定义符号对象和创建符号表达式的方法&#xff1b; 2&#xff09;掌握符号运算基本命令和规则&#xff1b; 3&#xff09;掌握符号表达式的运算法则以及符号矩阵运算&#xf…

[JavaEE初阶] 类加载机制

在真正的战争到来之前,尽可能地变得强大吧~ 文章目录 前言1. 类加载1.1 类加载的过程1.2 类加载的时机1.3 双亲委派模型 前言 这个问题是面试经典题,让我们来求甚解吧~ 1. 类加载 1.1 类加载的过程 如下图 加载,找到.class文件,读取文件内容验证,验证.class文件的格式是否…

SQL优化(3):order by优化

MySQL的排序&#xff0c;有两种方式&#xff1a; Using filesort : 通过表的索引或全表扫描&#xff0c;读取满足条件的数据行&#xff0c;然后在排序缓冲区sort buffer中完成排序操作&#xff0c;所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序。 Using index :…

Spring lettuce读写分离

Redis 的 Sentinel 模式默认配置下 Redis 的客户端只对 Master 读写&#xff0c;另外2个Slave闲置。若主从节点在不同机房&#xff0c;在读取时会有跨机房的网络时延&#xff0c;并且比同机房访问更容易发生网络丢包。故在一些场景可以考虑将跨机房的服务节点设置为读写分离 Re…

Python中 re.findAll()、re.sub()、set()的使用

1. re.findall() re.findall()&#xff1a;函数返回包含所有匹配项的列表。返回string中所有与pattern相匹配的全部字串&#xff0c;返回形式为list / 数组。 由函数原型代码可知&#xff0c;findall() 函数存在三个参数&#xff1a; 1. pattern&#xff1a;正则表达式中的 ‘模…

Opencv+Python笔记(五)图像阈值化处理

图像阈值化可以理解为一个简单的图像分割操作&#xff0c;阈值又称为临界值&#xff0c;它的目的是确定出一个范围&#xff0c;然后这个范围内的像素点使用同一种方法处理&#xff0c;而阈值之外的部分则使用另一种处理方法或保持原样。 阈值处理有2种方式&#xff0c;一种是固…

订单交期迟滞,销售回应慢,怎么解决客户问题?

按客户定制产品订单&#xff0c;进行报价和生产的制造企业&#xff0c;有拆解图纸生成物料BOM的工序&#xff0c;通常由企业产品设计部门的拆图员岗位专门负责。 手工制作BOM数据&#xff0c;准确性低 拆图员肉眼查看每页图纸中的表格数据&#xff0c;手动敲键盘填入到企业要…

Android之 颜色选择器

一&#xff0c;简介 1.1 计算机的颜色通常有两种表示方式&#xff1a; 光源模式RGB(Red红, Green绿, Blue蓝)&#xff0c;数值0-255 印刷模式CMYK(Cyan青, Magenta品红, Yellow黄, Black黑)&#xff0c;数值1-100 任何颜色都是由RGB或CMYK混合出来的&#xff0c;再加上透明度…

【HTML+CSS+JS】登录注册页面大合集

前言 学JS也学了一段时间&#xff0c;正巧碰上了人工智能要调用人脸识别接口进行真人人脸识别&#xff0c;于是便萌生了用人脸来进行注册和登录的想法&#xff0c;这样的话就需要开发一个登录注册页面&#xff0c;然后用JS绑定注册事件调用人脸识别接口进行登录注册 饭要一口一…

【数据结构:线性表】单链表

在学习了顺序表&#xff0c;我们可能会对其有一些思考&#xff1a; 中间/头部的插入删除&#xff0c;时间复杂度为O(N)增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗。增容一般是呈2倍的增长&#xff0c;势必会有一定的空间浪费。例如当前容…

【校招VIP】面试了一个抽奖的项目,我终于搞明白了,是8股文终于开始作恶了

最近因为招实习生&#xff0c;进行了很多次面试。 但面试的结果不尽人意。 就感觉今年的面试跟以前差距太大了。 直到经过这个同学的面试&#xff0c;我终于明白了是什么原因。 这个同学是南京一所211的研究生&#xff0c;他的项目经历是做了一个抽奖的微服务管理平台。 也…

10、Mysql常见面试题

Mysql常见面试题 文章目录 Mysql常见面试题一 Mysql索引001 Mysql如何实现的索引机制&#xff1f;002 InnoDB索引与MyISAM索引实现的区别是什么&#xff1f;003 一个表中如果没有创建索引&#xff0c;那么还会创建B树吗&#xff1f; 004 说一下B树索引实现原理&#xff08;数据…

2023移动云大会 | “六大”服务承诺 全力做优“心级服务”

4月25日&#xff0c;以“云擎未来 智信天下”为主题的2023移动云大会在苏州金鸡湖国际会议中心举办&#xff0c;众多政府领导、院士专家、知名企业客户与合作伙伴高层等数千名嘉宾齐聚一堂。 大会期间&#xff0c;移动云深入践行“为国建云”的使命&#xff0c;推出“六大”服…