信号的产生和保存

信号的产生

信号就是操作系统对用户操作做出的反应,但它的本质就是往操作系统写入信号,这是由操作系统的结构决定的。通过修改比特位来告诉操作系统接收信号和传了几号信号。

也正是因为我们身为用户无法亲自修改内核数据,所以我们需要通过操作系统提供的系统调用来让操作系统帮我们做修改操作。

kill -l

我们可以通过kill -l来查看系统提供的命令列表

但是并非所有信号我们都能用到,一般情况下,我们只会用1-31号信号,这也是为什么我们程序正常结束是返回0了,因为0号信号不存在,也就不会报错。

signal

如果我们想要自定义信号的转化方式,那么必须是这样空返回值,一个整型参数的函数

这个整型参数就是用来接收转化前收到的信号的。

这样当我们遇到了sigint时就会转化成对我们handlersig的调用

那么当我们运行这个文件时,一旦我们想要ctrl+c终止时,就会被转化成对handlersig的调用

可是新的问题来了,我们要是所有信号都自定义了,那么会不会永远退不出来呢,其实不会的,因为操作系统为了防止恶意进程专门设置了一个kill -9信号,它无法被自定义,所以我们可以用它来终止进程。

这样进程依旧被我们终止了。

我们也可以重写一个直接用来删除的文件

上面这一类我们都可以归类于是键盘产生的信号。

系统调用信号

这个理解起来挺简单的,我们调用的每一个系统函数都会有信号产生,不过我们可以通过系统调用了解一下系统的信号是怎么产生的。

raise

abort

这个系统函数会强制让信号执行它的默认操作,这样即使我们捕捉了对应信号想要执行自定义操作也不行了。

异常产生信号

信号的产生还有一种,就是异常。如果我们的进程有什么问题,也会触发异常信号,比如说 /0 或者说野指针问题。

可以看到 /0的异常是8号信号,而野指针则是11号信号。

那么操作系统是怎么知道这些问题的呢。

首先操作系统管理着软硬件,而硬件里的寄存器会记录当前进程的状态,那么一旦状态出了问题,它就会通过上下文和task_struct找到进程然后发送对应的异常信号。

野指针问题也差不多,它是属于CR3存储的目录地址和虚拟地址给MMU转化后没有对应的映射关系,所以失败了,那么寄存器同样记录异常状态然后返回给进程。

alarm以及pause

alarm就单纯是个闹钟而已。

通过捕捉闹钟信号,实现个闹钟死循环。

pause则是只有信号返回时它才有反应,否则就一直暂停着。

这俩单看都没啥用的感觉,但是结合起来,它就接近操作系统的本质了。

操作系统本身也是一个死循环,只有收到对应信号才会做出对应的操作,是不是没事的时候就像上面的pause暂停,有事的时候就像接收到闹钟信号做出反应。不过操作系统里的闹钟可能是一个结构体,存储着对应任务的触发时间和优先级,再由堆管理起来,这样操作系统拿堆顶的进程开始运行,这样就知道什么时候运行上面进程又返回什么信号。

以上就是信号产生的过程。

信号的保存

信号的保存又分为三种情况 递达、未决、阻塞

递达

递达就是操作系统成功接收之后的状态。

递达又分为自定义、默认、忽略

自定义就是我们之前的signal把捕捉的信号自定义成我们想要的方法。

默认就是不捕捉,按照信号表里的方法执行信号操作。

忽略则是虽然我接收了信号,但是无视你 你哪里凉快哪里待着。

未决

未决指的是信号产生到递达前的状态。

阻塞(屏蔽)

阻塞是我专门在你递达之前卡住你,等我有空处理你的时候再让你递达。

它和忽略是前后者的关系,并不相同,忽略是已递达但是不处理,阻塞是我可能暂时没空接收你,你先别等着。

block pending handler

操作系统用三个表来标识上面的状态

横着看来判断X号信号属于什么情况。

比如一号信号已被接收未阻塞执行方法为默认。

既然有这张表那么操作系统就为我们提供了一个函数来修改它.

sigprocmask

这个函数可以修改block表内的数据

第一个是我们用什么方法修改,第二个则是根据第一个参数给,第三个是为了防止你改错了改不回来,所以需要提供一个容器存旧数据。

第一个参数block是直接新增信号到block表里。

第二个则是通过先取反再与的操作修改信号。

第三个是我们直接提供整张修改后的block表覆盖旧表。

实际上用起来第三种才方便。

这里的sigset_t 就是容器的类型,它是一个系统定义的结构体。我们把它初始化后作为参数传入

sigprocmask里,这样就设置出了一个全部不阻塞的block表,但是这些操作都只在当前作用域

所以我们需要使用sigaddset把它添加到信号集内,我们可以理解为上传存档。

然后我们就可以用sigpending查看它的数据变化了,一旦我们传入任何一个信号

那么它的全0就会被改变。

最后我们输入2号信号,我们可以看到一开始为全为0的pending表第二位变成了1,这就代表它成功接收到了我们的2号信号。

sigpending

pending表只支持查看,我们同样传入一个容器,它会把数据拷贝进容器然后返回,至于为什么不支持修改,因为我们的信号产生那么多种方式,我们大可以直接用键盘异常这样的修改。

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

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

相关文章

在C++ Qt中集成Halcon窗口并实现跨平台兼容和大图加载

目录 1. Halcon窗口嵌入Qt Widget 2. 处理大图加载 3. 多线程优化显示 4. 跨平台兼容性 1. Halcon窗口嵌入Qt Widget 将Halcon的HWindow控件嵌入到Qt的QWidget容器中,利用系统原生句柄实现跨平台。 #include <HalconCpp.h> #include <QWidget>class HalconWi…

深度学习技术与应用的未来展望:从基础理论到实际实现

深度学习作为人工智能领域的核心技术之一&#xff0c;近年来引起了极大的关注。它不仅在学术界带来了革命性的进展&#xff0c;也在工业界展现出了广泛的应用前景。从图像识别到自然语言处理&#xff0c;再到强化学习和生成对抗网络&#xff08;GAN&#xff09;&#xff0c;深度…

蓝光三维扫描技术:汽车零部件检测的精准高效之选

——汽车方向盘配件、保险杠塑料件、钣金件检测项目 汽车制造工业的蓬勃发展&#xff0c;离不开强大的零部件制造体系作支撑。汽车零部件作为汽车工业的基础&#xff0c;其设计水平、制造工艺、质量控制手段逐渐与国际标准接轨&#xff0c;对于零部件面差、孔位、圆角、特征线…

数据库联表Sql语句建一个新表(MySQL,Postgresql,SQL server)

数据库联表Sql语句建一个新表(MySQL,Postgresql,SQL server) 如果你想基于 SELECT USERS.ID,USERS.NAME,USERS.EMAIL,USERS.ID_CARD,USERS.V_CARD,USERS.ADDRESS,v_card.type,v_card.amount FROM USERS JOIN v_card on USERS.V_CARDv_card.v_card 这个查询结果创建一个新表&am…

六十天前端强化训练之第三十天之深入解析Vue3电商项目:TechStore全栈实践(文结尾附有源代码)

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 深入解析Vue3电商项目&#xff1a;TechStore全栈实践 一、项目架构设计 二、核心功能实现 三、组合式API深度实践 四、性能优化实践 五、项目扩展方向 六、开发经验总结…

【人工智能】机器学习中的评价指标

机器学习中的评价指标 在机器学习中&#xff0c;评估指标&#xff08;Evaluation Metrics&#xff09;是衡量模型性能的工具。选择合适的评估指标能够帮助我们更好地理解模型的效果以及它在实际应用中的表现。 一般来说&#xff0c;评估指标主要分为三大类&#xff1a;分类、…

不同机床对螺杆支撑座的要求有哪些不同?

螺杆支撑座是机械设备中重要的支撑部件&#xff0c;其选择直接影响到设备的稳定性和使用寿命&#xff0c;尤其是在机床中&#xff0c;不同的机床对螺杆支撑座的要求也是不同的。 1、精度&#xff1a;精密测量用的基准平面和精密机床机械的检验测量设备&#xff0c;需要使用高精…

在Spring Boot中,可以通过实现一些特定的接口来拓展Starter

在Spring Boot中&#xff0c;开发者可以通过实现一些特定的接口来拓展Starter。这些接口允许开发者自定义Spring Boot应用程序的配置和行为&#xff0c;从而创建功能丰富且易于使用的Starter。以下是一些关键的接口&#xff0c;用于拓展Starter&#xff1a; EnvironmentPostPro…

深入理解 tree 命令行工具:目录结构可视化的利器

文章目录 前言1. 什么是 tree 命令&#xff1f;安装 tree 2. tree 的基本用法显示当前目录的树状结构显示指定目录的树状结构 3. tree 的常用选项3.1 显示隐藏文件3.2 排除特定目录或文件3.3 限制递归深度3.4 显示文件大小3.5 显示文件的权限信息3.6 将输出保存到文件 4. 实际应…

Federated learning client selection algorithm based on gradient similarity阅读

基于梯度相似性的联邦学习客户端选择算法 Abstract 摘要introduction**背景****目的****结论****结果****讨论****思路** 链接&#xff1a;https://link.springer.com/article/10.1007/s10586-024-04846-0 三区 Abstract 摘要 联邦学习&#xff08;FL&#xff09;是一种创新的…

【测试工具】如何使用 burp pro 自定义一个拦截器插件

在 Burp Suite 中&#xff0c;你可以使用 Burp Extender 编写自定义拦截器插件&#xff0c;以拦截并修改 HTTP 请求或响应。Burp Suite 支持 Java 和 Python (Jython) 作为扩展开发语言。以下是一个完整的流程&#xff0c;介绍如何创建一个 Burp 插件来拦截请求并进行自定义处理…

网络编程的概念&作用

网络编程是什么&#xff1f; 想象一下&#xff0c;你和朋友在不同的房间里&#xff0c;你们想互相传递纸条聊天。网络编程就像是编写一套规则&#xff0c;让计算机能够通过网络&#xff08;比如互联网&#xff09;互相传递信息。这些信息可以是文字、图片、视频&#xff0c;甚…

航天军工与金融行业 UE/UI 设计:跨越领域的体验革新之道

在数字化时代&#xff0c;用户体验&#xff08;UE&#xff09;和用户界面&#xff08;UI&#xff09;设计成为众多行业提升竞争力的关键因素。航天军工与金融行业虽业务性质差异巨大&#xff0c;但在 UE/UI 设计方面却面临着一些相似挑战&#xff0c;同时也在各自的探索中展现出…

【Git】--- 分支管理

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; Git 本篇博客我们来介绍Git的一个重要功能之一 ---- 分支。我们将讲解关于分支的各种操作&#xff0c;以及如何帮助我们进行开发。 &#x1f3e0; 理解分支…

纯血鸿蒙:中国操作系统自主创新的里程碑

引言&#xff1a;破局者登场 2024 年 10 月&#xff0c;搭载纯血鸿蒙操作系统&#xff08;HarmonyOS NEXT&#xff09;的华为 Mate 70 系列正式发布&#xff0c;首日预约量突破 330 万。这场现象级热度的背后&#xff0c;不仅是消费者对硬件创新的期待&#xff0c;更是中国科技…

二造考试的备考过程中如何保持良好的心态?

在二级造价师考试的备考过程中&#xff0c;保持良好的心态至关重要&#xff0c;以下是一些有效的方法&#xff1a; 树立正确的考试观念 )认识到二级造价师考试是职业生涯中的一个重要环节&#xff0c;但不是唯一的决定因素。把它看作是提升自己专业能力、丰富知识储备的机会&am…

Vue3前端开发:组件化设计与状态管理

Vue3前端开发&#xff1a;组件化设计与状态管理 一、Vue3组件化设计 组件基本概念与特点 是一款流行的JavaScript框架&#xff0c;它支持组件化设计&#xff0c;这意味着我们可以将页面分解成多个独立的组件&#xff0c;每个组件负责一部分功能&#xff0c;通过组件的嵌套和复用…

动手学深度学习11.9. Adadelta-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;72 优化算法【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&#xff1a;11.9. Adadelta —…

Android Audio基础(13)——audiomixer

在 Android 平台上&#xff0c;音频混合器 AudioMixer 主要用在 AudioFlinger 里&#xff0c;将多路音频源数据混音&#xff08;包括混音、音量处理、重采样及处理声道等&#xff09;。位于 framework 的音频处理模库 libaudioprocessing&#xff08;frameworks/av/media/libau…

【React】使用Swiper报错`Swiper` needs at least one child

问题 聊天页面的表情面板&#xff0c;滑动效果使用了ant design mobile的Swiper。 原代码中&#xff0c;Swiper 组件在 isShow 为 false 时渲染的是 <></>&#xff08;空元素&#xff09;&#xff0c;控制台警告Swiper needs at least one child&#xff0c;Swip…