Linux学习之路 -- 信号的处理

news2024/9/27 9:29:10

前面介绍了信号的保存与产生的基本原理,下面介绍一下信号处理的相关知识。

1、信号何时被处理?

前面我们提到,信号在被进程接受后,不一定会被马上处理,而是要等到合适的时机才会被进程处理。而这个合适的时机其实就是OS在从内核态转为用户态时,对信号进行处理的。

<1>内核态与用户态:

什么是内核态,什么是用户态呢?简单来说,内核态是我们调用系统调用或处理中断和异常时,OS就会陷入内核,此时就处于一种内核态。而用户态就是执行普通的代码(例如循环、判断语句)时,系统所处的状态。下面用一张图来先简单了解一下。

当OS执行中断、异常、系统调用时会进入内核,当内核处理完这些异常时,就会检查是否有信号需要处理。如果信号自定义了处理函数,那么OS会转回用户态执行信号自定义处理函数。处理完成后,会返回内核态,然后再从主控制流程中上次被中断的地方继续向下执行(一定是先回内核,再返回主控制流程)。为了方便理解,我们可以将该过程中的状态转换抽象成上图B。图中的交点就是信号处理的过程,而这一个流程下来会经历4次状态的变换。(为了方便记忆,我们可以将其看成倒8,或是无穷大符号)

为了更深入的理解用户态与内核态,我们需要对地址空间进行重新的认识。
        前面我们介绍的地址空间,都只是再用户的3GB的空间内,而在地址空间中,内核空间的1GB,我们一直没有介绍,这内核的1GB其实就是用来映射操作系统的一些信息的。

在用户级的页表中,进程可以向内存中存储自己的数据。而内核级的页表是用于映射OS(OS只有一个)的关键数据和相关结构,也就是说,所有进程的内核页表是可以一样的,它们都用于映射物理内存中同一块空间,而这也就是不同的进程能访问同一操作系统中的数据和一些调用。尤其是系统调用,系统调用其实就是函数指针数组,调用系统调用其实就是先获取该数组的地址,然后进入内核空间访问数组中对应的方法。而用户态和内核态的转换,其实就是在用户空间和内核空间中进行不断地切换。

<2>操作系统是如何运行

前面我们提到,当键盘产生硬件中断时,cpu会暂停处理正在运行的进程,并且通知OS从对应的寄存器中读取硬件中断的相关数据,然后查找对应的处理函数并处理。而中断向量表这个设计,其实和我们的信号非常相似。实际上,信号技术的产生就是为了模拟硬件中断,只不过这个是以软件的方式对其进行模拟。

进程可以被OS调度运行,但是谁来让OS运行起来呢?答案就是硬件中断,当硬件中断产生时,OS会去对应中断向量表中查询下一步该做什么。当查询到后,就会执行对应的操作,就比如进程调度等。为了让OS正常运行,我们就需要一个能以非常高频,并且在极短时间内产生中断的装置。这样,我们就能使cpu不断地处理中断,而OS也就会不断查询对应操作而正常运行。而这个过程就称为OS的周期时钟中断。而我们也可以看出,操作系统是一个死循环,需要不断处理外部的硬件中断。

<3>内核态和用户态在硬件中的标识

在地址空间当中,OS在执行用户代码时,是不能随意的访问内核中的数据。因为OS不会信任任何人,所以产生了内核态和用户态防止用户空间中的代码随意访问内核中的数据。为了标识这两个状态,cpu中会存在一个寄存器,里面存储了两个比特位,其中我们以0标识内核态,3标识用户态。当然,这个过程非常复杂,这里简单介绍。

2、信号处理函数sigaction

该接口的功能比signal要更加强大一些。第一个参数表示需要处理的信号,第二个参数和第三个参数都是struct sigaction结构,第二个参数表示新的处理方法,第三个参数表示老的信号处理方法。下面我们看一下这个结构体的具体参数。

该结构中,第一个参数是一个信号处理的自定义函数,第二个暂时不需要关心,这是处理实时信号的,第三个是一个信号集,第四个标志设置为零即可,第五个成员暂时也可以不用设置。

这个信号集是屏蔽信号集,当某个信号的处理被调用是,内核自动将当前信号加入进程的信号屏蔽字。如果我们处理完对应的信号,该信号默认也会从信号屏蔽字中进行移除,这样做主要是为了不想让信号嵌套式地捕捉处理。如果我们希望屏蔽其他信号,就需要向该信号集中添加信号即可。

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

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

相关文章

Ubuntu22.04版本左右,开机自动启动脚本

Ubuntu22.04版本左右&#xff0c;开机自动启动脚本 1. 新增/lib/systemd/system/rc-local.service中[Install]内容 vim /lib/systemd/system/rc-local.service 按 i 进入插入模式后&#xff0c;新增内容如下&#xff1a; [Install] WantedBymulti-user.target Aliasrc-local.…

【LeetCode】01.两数之和

题目要求 做题链接&#xff1a;1.两数之和 解题思路 我们这道题是在nums数组中找到两个两个数使得他们的和为target&#xff0c;最简单的方法就是暴力枚举一遍即可&#xff0c;时间复杂度为O&#xff08;N&#xff09;&#xff0c;空间复杂度为O&#xff08;1&#xff09;。…

苹果qq文件过期了怎么恢复?简单4招,拯救你的过期文件

相较于微信而言&#xff0c;qq可以一次性发送数量较多且所占内存较大的文件。因此&#xff0c;较多用户都会选择使用qq来传输文件。但不可避免的是&#xff0c;我们有时也会遇到忘记下载文件&#xff0c;导致qq文件过期的情况&#xff0c;对此&#xff0c;该如何解决qq文件过期…

在NAS上打造AI加持的云端个人开发环境

作为一个有追求程序员&#xff0c;在工作之余有时也需要搞点开发&#xff0c;这时开发环境就成为一个有点棘手的问题。每个程序员都希望有一个长期的、稳定的开发环境&#xff0c;这样用起来才顺手。用工作电脑毕竟有不方便的方面&#xff0c;各种全家桶、监控、访问限制……总…

HTML 基本语法以及结构标签

1. HTML 基本语法 2. 标签关系 3. 基本结构标签 演示&#xff1a;打开页面&#xff0c;右击“打开源代码”&#xff08;CTRLU&#xff09;可以查看源代码; 4. VSCode 工具生成骨架标签 4.1 文档声明类型标签 注意&#xff1a; 4.2 lang 语言种类 4.3 字符集 4.4 总结

maven-helper插件解决jar包冲突实战

经常遇到jar包冲突问题&#xff0c;今天梳理一下&#xff1a; 1、打开idea 2、安装后 打开pom文件 点击 3、 4、 5、 6、 7、 8、 9、 可参考的类似文章

计数dp+组合数学,CF 213B - Numbers

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 213B - Numbers 二、解题报告 1、思路分析 从0~9依次填写 对于0&#x…

[UVM]5.config机制 report 消息管理

1.config机制 &#xff08;1&#xff09;概述 SV只能例化后通过句柄访问&#xff0c;配置前必例化。 &#xff08;2&#xff09;uvm_config_db uvm_congfig_db就是关联数组&#xff0c;path和value组成。 传递配置对象&#xff08;config object&#xff09;就是传递句柄。 …

Ps:颜色模型、色彩空间及配置文件

颜色模型、色彩空间和配置文件是处理颜色的核心概念。它们虽然互相关联&#xff0c;但各自有不同的功能和作用。 通过理解这些概念及其关系&#xff0c;Photoshop 用户可以更好地管理和优化图像处理流程&#xff0c;确保颜色在不同设备和应用中的一致性和准确性。 颜色模型 Col…

ERP系统在IC设计行业的必要性

在当今这个科技日新月异的时代&#xff0c;集成电路(IC)设计行业作为信息技术发展的核心驱动力之一&#xff0c;正面临着前所未有的挑战与机遇。随着产品复杂度的提升、市场需求的快速变化以及全球供应链的紧密交织&#xff0c;如何高效管理设计资源、优化生产流程、提升响应速…

【Netty】实战:基于Http的Web服务器

目录 一、实现ChannelHandler 二、实现ChannelInitializer 三、实现服务器启动程序 四、测试 本文来实现一个简单的Web服务器&#xff0c;当用户在浏览器访问Web服务器时&#xff0c;可以返回响应的内容给用户。很简单&#xff0c;就三步。 一、实现ChannelHandler pack…

Spring之拦截器(HandlerInterceptor)

前言 在web开发中&#xff0c;拦截器是经常用到的功能&#xff0c;用于拦截请求进行预处理和后处理&#xff0c;一般用于以下场景&#xff1a; 日志记录&#xff0c;可以记录请求信息的日志&#xff0c;以便进行信息监控、信息统计、计算PV&#xff08;Page View&#xff09;等…

C++ 继承(二)

目录 1. 实现一个不能被继承的类 2. 友元与继承 3.继承与静态成员 4.多继承及其菱形继承问题 (1). 继承模型 (2). 虚继承 (2.1)虚继承解决数据冗余和二义性的原理 (3). 多继承中指针偏移问题 (4). IO库中的菱形虚拟继承 5. 继承和组合 1. 实现一个不能被继承的类 方法1…

内蒙古众壹集团:引领蒙东财税服务行业,成就企业发展新高度

内蒙古众壹企业管理集团有限公司自2019年成立以来&#xff0c;凭借卓越的服务和专业的团队&#xff0c;迅速成长为蒙东地区财税服务行业的先锋企业。 公司在成立初期&#xff0c;通过加盟慧算账平台&#xff0c;快速进入市场&#xff0c;并设立了多个分公司&#xff0c;逐步扩展…

Daily2:字体描边

有一个小的需求,需要对字体进行描边,一开始理解错了需求,以为要对字体镂空处理,然后尝试了许多做错了许多 后来发现是一个简单的描边处理,直接chatgpt就可以得出来一个简单的实现代码, class BorderTextView JvmOverloads constructor(context: Context, attrs: AttributeSet?…

读懂以太坊源码(3)-详细解析genesis.json

要想搞懂以太坊的源代码逻辑&#xff0c;必须要了解以太坊创世区块配置文件(genesis.json)的结构&#xff0c;以及每个配置参数的意义&#xff0c;创世配置文件&#xff0c;主要作用是设置链的ID&#xff0c;指定以太坊网络中硬分叉发生的区块高度&#xff0c;以及初始ETH数量的…

【系统分析师】-软件测试

目录 1、测试的类型 1.1、动态测试 1.1.1、黑盒法 1.1.2、白盒法 1.1.3、灰盒法 1.2、静态测试 2、测试阶段 2.1、单元测试 2.2、集成测试 2.3、确认测试 2.4、系统测试 3、性能测试 3.1、性能测试的目的 3.2、性能测试的类型 3.3、性能测试的步骤 5、测试设计…

【操作系统存储篇】Linux文件基本操作

目录 一、Linux目录 二、Linux文件的常用操作 三、Linux文件类型 一、Linux目录 Linux有很多目录&#xff0c;Linux一切皆是文件&#xff0c;包括进程、设备等。 相对路径&#xff1a;相对于当前的操作目录&#xff0c;文件位于哪个目录。 绝对路径 &#xff1a;从根目录开…

面对AI时代快车,你没必要跟车赛跑,而是应该先去考个驾照!

在当今人工智能领域&#xff0c;代码生成和编辑工具成为了开发者们手中的利器。昨天&#xff0c;零一万物公司再次展示了他们在开源社区中的领导地位&#xff0c;开源了 Yi-Coder 系列编程助手模型&#xff0c;这一举措不仅标志着该公司继今年5月开源Yi-1.5系列模型后的又一重大…

智能提醒助理系列-服务号静默登录

本系列文章记录“智能提醒助理”wx公众号 建设历程&#xff0c;记录实践经验、巩固知识点、锻炼总结能力。 本文介绍&#xff0c;如何让用户进入公众号之后就锁定用户&#xff0c;使用既注册&#xff0c;进入既可使用功能&#xff0c;去掉繁琐的登录认证流程。 一、需求出发点 …