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

引言:

北京时间: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等也可能在出现异常情况时向操作系统发送信号,这些信号通常用于告知操作系统需要采取一些措施来解决问题或仅仅是通知用户有问题发生,这也就是为什么野指针问题,访问越界问题最终程序会崩溃,本质就是因为收到了一定的信号,该信号会导致程序终止

在这里插入图片描述

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

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

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

相关文章

Postman预请求脚本、测试脚本(pre-request scripts、tests常用工作总结)

文章目录 Postman预请求脚本&#xff08;pre-request scripts工作常用总结&#xff09;Postman预请求脚本Postman测试脚本预请求脚本和测试脚本有什么区别常用工作总结登录接口返回的是Set-Cookie标头 Postman预请求脚本&#xff08;pre-request scripts工作常用总结&#xff0…

2008-2019年主要城市PITI指数

2008-2019年主要城市PITI指数 1、来源&#xff1a;附在文件内 2、时间区间&#xff1a;2008-2019年 3、具体时间分布&#xff1a;、2008、2009-2010、2011、2012、2013-2014、2014-2015、2015-2016、2016-2017、2017-2018、2018-2019、 4、范围&#xff1a;包括110个城市&a…

Afkayas.1(★)

软件运行 要输入正确的Name和Serial 查壳 一个VB程序&#xff0c;没有加壳 载入OD 直接开搜索字符串。 这里看到了错误的提示&#xff0c;“You Get It”应该就是成功的字符串了。 前面的“AKA-”应该是在什么时候拼接的字符串 去成功的字符串附近看看 这个字符串上面…

网络编程 总结三

一、并发服务器模型 【1】 循环服务器 1>一次只能处理一个客户端的请求&#xff0c;等待这个客户端退出后&#xff0c;才能处理下一个客户端 2>缺点&#xff1a;循环服务器所处理的客户端不能有耗时操作 //*****模型****** sfd socket(); bind(); listen(); while(1)…

js 操作数组内容

js 操作数组内容 数组添加元素&#xff08;更改原数组&#xff09; push和unshift会返回添加了新元素的数组长度 push从数组最后加入&#xff0c;unshift从数组最前面加入 const arr ["a", "b", "c"]; arr.push("d"); //返回4…

【高危】泛微 e-cology <10.57 存在 SQL注入漏洞(POC)(MPS-ndqt-0im5)

漏洞描述 泛微协同管理应用平台(e-cology)是一套企业大型协同管理平台。 泛微 e-cology 受影响版本存在SQL注入漏洞&#xff0c;未经授权的远程攻击者可通过发送特殊的HTTP请求来获取数据库的敏感信息。 漏洞名称GeoServer 存在 sql 注入漏洞漏洞类型SQL注入发现时间2023/4/…

解密PyTorch动态计算图:打破深度学习束缚的秘密武器

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

Linux 用户管理与文件权限

Linux 是一个多用户系统&#xff0c;它允许多个用户同时登陆主机&#xff0c;并为他们分配不同的资源和工作环境进行使用。当然&#xff0c;不同的用户都有文件的私有需求&#xff0c;所以设置不同用户文件的权限管理十分重要。 01 用户与用户组 Linux 中一般将文件访问权限的…

2023有哪些适合学生的蓝牙耳机?盘点四款适合学生的无线蓝牙耳机

随着时代的发展&#xff0c;人们更青睐于能够提升生活品质的产品。蓝牙耳机因为摆脱了线的束缚&#xff0c;使用体验会更好。接下来&#xff0c;我来给大家推荐几款适合学生用的无线蓝牙耳机&#xff0c;有需要的朋友可以当个参考。 一、南卡小音舱Lite2蓝牙耳机 参考价&…

【hello Linux】进程间通信——共享内存

目录 前言&#xff1a; 1. System V共享内存 1. 共享内存的理解 2. 共享内存的使用步骤 3. 共享内存的使用 1. 共享内存的创建 查看共享内存 2. 共享内存的释放 3. 共享内存的挂接 4. 共享内存的去挂接 4. 共享内存的使用示例 1. 两进程挂接与去挂接演示&#xff1a; 2. 两进程…

高性能:负载均衡

目录 什么是负载均衡 负载均衡分类 服务端负载均衡 服务端负载均衡——软硬件分类 服务端负载均衡——OSI模型分类 客户端负载均衡 负载均衡常见算法 七层负载均衡做法 DNS解析 反向代理 什么是负载均衡 将用户请求分摊&#xff08;分流&#xff09; 到不同的服务器上…

中移链控制台对接4A平台功能验证介绍

中移链控制台具备单独的注册登录页面&#xff0c;用户可通过页面注册或者用户管理功能模块进行添加用户&#xff0c;通过个人中心功能模块进行用户信息的修改和密码修改等操作&#xff0c;因业务要求&#xff0c;需要对中移链控制台的用户账号进行集中管理&#xff0c;统一由 4…

什么是分布式任务调度?怎样实现任务调度

通常任务调度的程序是集成在应用中的&#xff0c;比如&#xff1a;优惠卷服务中包括了定时发放优惠卷的的调度程序&#xff0c;结算服务中包括了定期生成报表的任务调度程序&#xff0c;由于采用分布式架构&#xff0c;一个服务往往会部署多个冗余实例来运行我们的业务&#xf…

C S S

目录 1.样式定义方式 1.1行内样式表 1.2内部样式表 1.3外部样式表 2.注解 3.选择器 3.1标签选择器 3.2 id选择器 3.3 类选择器 3.4 派生选择器 3.5 伪类选择器 链接伪类选择器&#xff1a; 位置伪类选择器&#xff1a; ​编辑 目标伪类选择器&#xff1a; 复合选…

Winform从入门到精通(37)——FolderBrowserDialog(史上最全)

文章目录 前言1、Name2、Description3、RootFolder4、SelectedPath5、ShowNewFolderButton前言 当需要获取一个可以通过用户自由选择路径的时候,这时候就需要FolderBrowserDialog控件 1、Name 获取FolderBrowserDialog对象 2、Description 用于指示对话框的描述,如下: …

Windows forfiles命令详解,Windows按时间搜索特定类型的文件。

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 forfiles 一、结果输出格式二、按时间搜索三、搜索指定类型文件四、批量删除文件 forfile…

ATTCK v12版本战术介绍——防御规避(四)

一、引言 在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行、持久化、提权战术理论知识及实战研究、部分防御规避战术&#xff0c;本期我们为大家介绍ATT&CK 14项战术中防御规避战术第19-24种子技术&#xff0c;后续会介绍防御规避其他子技术&#xf…

【Unity URP】Rendering Debugger和可视化MipMap方案

写在前面 最近开始学习Unity性能优化&#xff0c;是结合了《Unity游戏优化》这本书和教程《Unity性能优化》第叁节——静态资源优化(3)——纹理的基础概念一起学习。在学习纹理优化部分时候遇到了问题&#xff0c;固定管线下Unity的Scene窗口有一个可视化Mipmap的渲染模式&…

PMP/高项 05-项目进度管理

项目进度管理 概念 项目进度管理&#xff08;Schedule Management) 项目进度管理又叫项目工期管理&#xff08;Duration Management)或项目的时间管理(Time Management) 是一种为管理项目按时完成项目所需的各个过程 进度管理过程 规划进度管理 定义活动 排列活动顺序 估算活…

【LeetCode】 309.最佳买卖股票时机含冷冻期

309.最佳买卖股票时机含冷冻期&#xff08;中等&#xff09; 思路 状态定义 一、很容易想到四种状态&#xff1a; a.今天买入&#xff1b;b.今天卖出&#xff1b;c.昨天卖出&#xff0c;今天处于冷冻期&#xff0c;无法进行操作&#xff1b;d.今天不操作&#xff0c;处于持有…