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

news2024/12/24 20:50:31

引言:

北京时间: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.coloradmin.cn/o/462319.html

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

相关文章

JetpackCompose从入门到实战学习笔记14——Coli的简单使用

JetpackCompose从入门到实战学习笔记14——Coli的简单使用 1.简介&#xff1a; Coil 是一个 Android官方出的配合Jetpack的图片加载库&#xff0c;通过 Kotlin 协程的方式加载图片。 优点如下&#xff1a; 更快: Coil 在性能上有很多优化&#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…

什么是OpenVino?以及如何使用OpenVino运行yolo

目录 Openvino简介 如何使用它&#xff1f; 构建源代码 Openvino IR模型 第一个Openvino示例 C语言示例 C示例 使用OpenVino跑Yolo模型 Openvino简介 Openvino是由Intel开发的专门用于优化和部署人工智能推理的半开源的工具包&#xff0c;主要用于对深度推理做优化。 …

开源,点云处理及三维重建软件(Point Cloud Viewer, PCV)的设计与实现

GitHub地址&#xff1a;point-cloud-viewer GitCode地址&#xff1a;point-cloud-viewer 文章目录 使用教程以及相关工具库Step 1 搭建环境Step 2 使用Cmake构建工程Step3 使用VS 编写code并编译执行 点云处理及三维重建软件(PCV)的设计与实现一&#xff0c; 软件总体设计1.1 软…

C++ LinuxWebServer 2万7千字的面经长文(下)

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! Linux Web Server项目虽然是现在C++求职者的人手一个的项目,但是想要吃透这个项目,还是需要一定的基础的,以项目为导向,进行基础的学习。 涵盖了计算机网络(网络编程…

springboot网上商城项目(一)

springboot网上商城项目&#xff08;一&#xff09; &#xff08;一&#xff09;项目分析1.项目分析2.开发顺序3.前端资源测试 &#xff08;二&#xff09;用户注册1.创建数据库2.实体类编写3.注册&#xff08;持久层&#xff09;4.注册&#xff08;业务层&#xff09;5.注册&a…

类ChatGPT的部署与微调(下):从ChatGLM-6b到ChatDoctor、可商用

前言 随着『GPT4多模态/Microsoft 365 Copilot/Github Copilot X/ChatGPT插件』的推出&#xff0c;绝大部分公司的技术 产品 服务&#xff0c;以及绝大部分人的工作都将被革新一遍 类似iPhone的诞生 大家面向iOS编程 有了App Store现在有了ChatGPT插件/GPT应用商店&#xff…

国产CMS61850那些事-服务端

前面两篇文章国产CMS61850那些事-总述_LinuxZQ的博客-CSDN博客&#xff0c;cms61850那些事-实现_LinuxZQ的博客-CSDN博客分别对国产61850做了一些简单介绍和相关实现。本文接着给大家提供一款服务端demo&#xff0c;可以用来进行抓包等相关学习。 与之前分享的mms 61850一样&am…

如此这般,好吗?

让我们回顾一下 Linux 社区最新的愿景——推动去中心化的应用来解决发行版的碎片化。继上周的文章&#xff1a;“Snap、Flatpak 这种通吃所有发行版的打包方式真的有用吗&#xff1f;” 之后&#xff0c;一系列新观点浮出水面&#xff0c;其中可能包含关于这样应用是否有用的重…

Vmware安装Ubuntu出现 unable to find a medium containing a live file system

一、前言 由于未知的原因&#xff0c;使用Vmware安装Ubuntu的时候&#xff0c;总是遇到奇怪的问题。&#xff08;忘记截图了…&#xff09; 大致是&#xff1a; unable to find a medium containing a live file system找了几个帖子&#xff0c;参考1、参考2&#xff0c;但都…

GPT模型成功的背后用到了哪些以数据为中心的人工智能(Data-centric AI)技术?

人工智能&#xff08;Artificial Intelligence, AI&#xff09;最近取得了巨大的进展&#xff0c;特别是大语言模型&#xff08;Large Language Models, LLMs&#xff09;&#xff0c;比如最近火爆全网的ChatGPT和GPT-4。GPT模型在各项自然语言处理任务上有着惊人的效果。至于具…

JAVA Future类详解及Thread线程是如何运行Future类的

一、Future基本介绍 Future(java.util.concurrent Interface Future<V>)表示异步计算的结果。Future接口提供了检查计算是否完成、检查计算是否被取消、等待计算完成并获取计算结果等方法。 在并发编程中&#xff0c;我们经常用到非阻塞的模型&#xff0c;但继承thread类…

基于 SpringBoot+Vue+Java 的留守儿童系统的研究与实现(附源码,教程)

文章目录 1.研究背景2. 技术栈3.系统分析4系统设计5系统的详细设计与实现5.1系统功能模块5.2管理员功能模块 1.研究背景 以往的留守儿童爱心的管理&#xff0c;一般都是纸质文件来管理留守儿童爱心信息&#xff0c;传统的管理方式已经无法满足现代人们的需求&#xff1b;使用留…

[激光原理与应用-69]:激光器-器件 - 三极管

第1章 什么是三级管 三极管&#xff0c;全称应为半导体三极管&#xff0c;也称双极型晶体管、晶体三极管&#xff0c;是一种控制电流的半导体器件。其作用是把微弱电流信号放大成幅度值较大的电流信号&#xff0c;也用作无触点开关。电流信号经过电阻后&#xff0c;就变成了电压…

ARM嵌入式编译器编译优化选项 -O

Arm嵌入式编译器可以执行一些优化来减少代码量并提高应用程序的性能。不同的优化级别有不同的优化目标&#xff0c;不仅如此&#xff0c;针对某个目标进行优化会对其他目标产生影响。比如想减小生成的代码量&#xff0c;势必会影响到该代码的性能。所以优化级别总是这些不同目标…

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

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

RK3568平台开发系列讲解(驱动基础篇)IO 模型的分类

🚀返回专栏总目录 文章目录 一、阻塞 IO二、非阻塞 IO三、IO 多路复用四、信号驱动五、异步 IO沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将针对IO模型进行分类。 假设有这样一个场景,从磁盘中循环读取 100M 的数据并处理,磁盘读取 100M 需要花费 20 秒的…

HR真的会嫌弃跳槽频繁的测试人员吗?

我们都知道&#xff1a;“跳槽≠涨薪”&#xff0c;但是对于测试人来说&#xff0c;跳槽绝哔能和升职加薪画上等号啊。 所以&#xff0c;有很多测试人在一家公司常常待不到1年&#xff0c;就另觅新东家&#xff0c;来借此达成升职加薪的目的。 有人提出质疑&#xff1a;为什么测…

【老王读SpringMVC-2】url 与 controller method 的映射关系注册

上文提到&#xff0c;如果我们自己要实现 spring mvc 框架的话&#xff0c;大致需要实现如下功能&#xff1a; 0、将 url 与 Controller method 的对应关系进行注册1、通过请求的 url 找到 Controller method (即 url 与 Controller method 的映射)2、将请求参数进行绑定&…