【Linux】:信号在内核里的处理

信号的发送和保存

  • 一.内核中的信号处理
  • 二.信号集操作函数
    • 1.一些信号函数
    • 2.sigprocmask
    • 3.sigpending
    • 4.写代码
  • 三.信号在什么时候处理的
  • 四.再谈地址空间

一.内核中的信号处理

1.实际执行信号的处理动作称为信号递达(Delivery
)2.信号从产生到递达之间的状态,称为信号未决(Pending)。
3.进程可以选择阻塞 (Block )某个信号。
4.被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作.
5.注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。

信号方法运行->handler表

普通信号【1-31】每一个都需要有自己的处理方法。这些方法分别是一个函数,而所有函数的指针都存在一个函数指针数组里(handler_t handler[31])。

在这里插入图片描述

信号阻塞->block表

再说说信号阻塞,其实顾名思义就是暂时把信号屏蔽,到合适的时候再将屏蔽解除,读取信号。在handler表和task_struct之间还有一张block表来标识是否屏蔽该信号。(注意屏蔽是一种状态与是否产生信号无关)

是否收到信号以及收到哪些信号->pending表

在这里插入图片描述

总结

1.每个信号都有两个标志位分别表示阻塞(block)和未决(pending),还有一个函数指针表示处理动作。信号产生时,内核在进程控制块中设置该信号的未决标志,直到信号递达才清除该标志。在上图的例子中,SIGHUP信号未阻塞也未产生过,当它递达时执行默认处理动作。
2.SIGINT信号产生过,但正在被阻塞,所以暂时不能递达。虽然它的处理动作是忽略,但在没有解除阻塞之前不能忽略这个信号,因为进程仍有机会改变处理动作之后再解除阻塞。
3.SIGQUIT信号未产生过,一旦产生SIGQUIT信号将被阻塞,它的处理动作是用户自定义函数sighandler。
4.如果在进程解除对某信号的阻塞之前这种信号产生过多次,将如何处理?POSIX.1允许系统递送该信号一次或多次。Linux是这样实现的:常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可以依次放在一个队列里。
5.信号处理实际上就是检测这三张表。

一个例子

在这里插入图片描述

在这里插入图片描述

将2号信号忽略后,操作系统就将handler表的2号信号的位置的操作方法变为忽略.

二.信号集操作函数

我们知道信号处理要经过三张表,毫无疑问这三张表是存在操作系统里的。想要从操作系统里获取信息,那么必定需要经过系统调用接口。

sigset_t类型

从上图来看,每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次,阻塞标志也是这样表示的。因此,未决和阻塞标志可以用相同的数据类型sigset_t来存储,sigset_t称为信号集,这个类型可以表示每个信号的“有效”或“无效”状态,在阻塞信号集中“有效”和“无效”的含义是该信号是否被阻塞,而在未决信号集中“有效”和“无效”的含义是该信号是否处于未决状态。 阻塞信号集也叫做当前进程的信号屏蔽字(Signal Mask),这里的“屏蔽”应该理解为阻塞而不是忽略。下面将详细介绍信号集的各种操作。

1.一些信号函数

sigset_t类型对于每种信号用一个bit表示“有效”或“无效”状态,至于这个类型内部如何存储这些bit则依赖于系统实现,从使用者的角度是不必关心的,使用者只能调用以下函数来操作sigset_t变量,而不应该对它的内部数据做任何解释,比如用printf直接打印sigset_t变量是没有意义的。

在这里插入图片描述

1函数sigemptyset初始化set所指向的信号集,使其中所有信号的对应bit清零,表示该信号集不包含 任何有效信号。
2.函数sigfillset初始化set所指向的信号集,使其中所有信号的对应bit置位,表示 该信号集的有效信号包括系统支持的所有信号。
3.注意,在使用sigset_ t类型的变量之前,一定要调 用sigemptyset或sigfillset做初始化,使信号集处于确定的状态,初始化sigset_t变量之后就可以在调用sigaddset和sigdelset在该信号集中添加或删除某种有效信号。

2.sigprocmask

调用函数sigprocmask可以读取或更改进程的信号屏蔽字(阻塞信号集)。

在这里插入图片描述

第一个参数:

在这里插入图片描述

第二个参数:自己创建的block表。

第三个参数:它是一个输出型参数,它会保存原始的block表(调用函数之前的表)。

3.sigpending

在这里插入图片描述

它是一个输出型函数。它的功能非常简单就是把我们pending表里所有的二进制序列带出,方便我们做检查。

总结:signal函数对应handler表,sigprocmask函数对应block表,sigpending函数对应pending表。

4.写代码

代码思路:将2号信号的block表设为阻塞,不断获取pending表,在初始状态pending表内应全为0,紧接着使用ctrl+c(发送2号信号),可以看到一瞬间pending表里一个数字变为了1(表示为递达)。

在这里插入图片描述

在这里插入图片描述

三.信号在什么时候处理的

前面说到信号会在合适的时间进行处理,那么合适的时间究竟是什么时候呢?

当进程从内核态返回用户态的时候,进行信号的检测和处理。

在这里插入图片描述

我们在调用系统调用时,很明显要陷入操作系统里,但进入操作系统是需要资格的,这时我们的身份就会变为内核态,当调用完毕后又会切回用户态。

四.再谈地址空间

在谈虚拟地址时,我们一般说什么共享区,代码区,常量区…其实都是在谈虚拟地址的一部分,还有一部分是内核空间,顾名思义就是访问系统调用的空间。虚拟地址映射到物理内存有页表,内核空间映射到物理内存也有内核级页表。与普通页表不同的是,每一个进程都有自己的普通页表,而内核级页表只有一张,也就是说系统调用函数的地址其实是固定的。

在这里插入图片描述

那么操作系统是怎么知道你是否进入了内核态呢?其实是因为寄存器,在CPU里有一个ecs寄存器,它的低两位就用来表示用户态和内核态,0表示内核态,3表示用户态。

在这里插入图片描述

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

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

相关文章

通义灵码,你的智能编码助手,免费公测啦!

目录 ​编辑 1、介绍 2、安装 3、功能介绍 行/函数级实时续写 自然语言生成代码 单元测试生成 代码注释生成 代码解释 研发智能问答 多编程语言、多编辑器全方位支持 4、视频 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家…

QT Day01 qt概述,创建项目,窗口属性,按钮,信号与槽

1.qt概述 1.什么是qt Qt 是一个跨平台的 C 图形用户界面应用程序框架。它为应用程序开发者提供建立艺 术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组 件编程。 2.支持的平台 Windows – XP 、 Vista 、 Win7 、 Win8…

博捷芯打破半导体切割划片设备技术垄断,国产产业链实现高端突破

近日,国内半导体产业传来喜讯,博捷芯成功实现批量供货半导体切割划片设备,打破国外企业在该领域的长期技术垄断,为国产半导体产业链在高端切割划片设备领域实现重大突破。 自上世纪90年代以来,由于国外企业的技术封锁和…

通俗易懂的spring Cloud;业务场景介绍 二、Spring Cloud核心组件:Eureka 、Feign、Ribbon、Hystrix、zuul

文章目录 通俗易懂的spring Cloud一、业务场景介绍二、Spring Cloud核心组件:Eureka三、Spring Cloud核心组件:Feign四、Spring Cloud核心组件:Ribbon五、Spring Cloud核心组件:Hystrix六、Spring Cloud核心组件:Zuul七…

vivado产生报告阅读分析25-复杂性报告

对于顶层设计和 / 或包含 1000 个以上叶节点单元的层级单元 , 复杂性报告会显示每个叶节点单元类型的“ Rent Exponent” ( Rent 指数 ) 、“ Average Fanout ” ( 平均扇出 ) 和分布。 Rent 指数是指在使用最小割 …

Linux中tar命令的几个高级用法

在Linux世界中,Tar命令是一把解密归档世界的魔法工具。无论是打包、压缩还是解压,Tar命令都能胜任。本文将生动地介绍Tar命令的基本用法,并深入探讨五个常用选项,帮助读者在Linux系统中灵活运用这个强大的工具。 一、命令概述 Ta…

西北大学计算机844考研-23年计网计算题详细解析

西北大学计算机844考研-23年计网计算题详细解析 1.计算无传输差错状态下停止—等待ARQ协议效率,电磁波传播速率为2*10^8m/s,链路长为2000m,帧长度为1000比特,计算传输速率10kbps及10Mbps时的协议效率(即信道利用率) …

[python]离线加载fetch_20newsgroups数据集

首先手动下载这个数据包 http://qwone.com/~jason/20Newsgroups/20news-bydate.tar.gz 下载这个文件后和脚本放一起就行,然后 打开twenty_newsgroups.py文件(在fetch_20newsgroups函数名上,右键转到定义即可找到) 之后运行代码即…

关于mybatis插入返回主键id和SpringBoot事务注解自调用演示

文章目录 一. 插入返回任意规则主键ID二. SpringBoot自调用事务2.1 场景12.2 场景2 自调用结论总结 一. 插入返回任意规则主键ID 实体对象 TableName("bank") Data public class Entity {TableId("id")Integer id;TableField("money")Integer …

TUP通信

一,概括 二,常用方法 三, 实现步骤(一发一收) 四,案例(一接一收) (1),客户端 (2),服务端 (3&…

1.2 C语言之变量与算数运算表达式概述

1.2 C语言之变量与算数运算表达式概述 一、华氏温度与摄氏温度对照二、代码概述三、练习 一、华氏温度与摄氏温度对照 #include <stdio.h>/*当华氏温度为 0,20,40,...300时&#xff0c;打印出华氏温度与摄氏温度对照表华氏温度与摄氏温度 C(5/9)(̧F-32) 其中C表示摄氏温…

8.二维数组——将一个二维数组行和列的元素互换,存到另一个二维数组中。

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 前言 本系列为二维数组编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 将一个二维数组行和列的元素互换&#xff0c;存到另一个二维数组中。 二、题目分析 三、解题 程序运行代码 #incl…

rdf-file:API

组件架构 intefaces模块&#xff1a;主要包含用户使用接口APItools模块&#xff1a;包含组件内核实现的文件操作工具codec模块&#xff1a;对文件结构&#xff0c;行数据&#xff0c;字段数据进行编码解码meta模块&#xff1a; 元数据配置以及加载loader/extension模块: 对配置…

Linux uname命令教程:如何打印linux操作系统名称和硬件的基本信息(附实例教程和注意事项)

Linux uname命令介绍 uname命令是一个在Linux中常用的命令行工具&#xff0c;用于打印有关操作系统名称和系统硬件的基本信息。uname这个名字来源于"UNIX name"。它最常用于确定处理器架构&#xff0c;系统主机名和系统上运行的内核版本。 Linux uname命令适用的Li…

Linux网络——数据链路层

目录 一.认识以太网 二.以太网帧格式 三.认识MAC地址 四.认识MTU 五.以太局域网的通信原理 六.其他重要协议 1.DNS协议 2.域名简介 3.ICMP协议 4.NAT技术 5.NAT技术的缺陷 6.NAT和代理服务器 一.认识以太网 "以太网" 不是一种具体的网络, 而是一种技术标…

必应的下一个十年:穿越创新的奇点时刻

2023年是微软搜索引擎必应进入中国市场十周年&#xff0c;2024年也将迎来必应上市十五周年。对于风起云涌的互联网公司来说&#xff0c;十年到十五年是一个相当长的创新周期。而在2023年初&#xff0c;以GPT为代表的大语言模型横扫全球科技产业&#xff0c;也对互联网和云计算带…

Docker | Docker部署MySQL

Docker | Docker部署MySQL ✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;Docker系列…

Excel如何比较两列数据的不同

当遇到exel有两个列表的数据&#xff0c;需要比较得到他们的不同的部分&#xff0c;并且得到一个不同的值的列表。示例如下&#xff1a; 目的是&#xff1a;通过比较&#xff0c;知道Column2的哪些值不在在Column1里。 WPS直接提供了这一个功能&#xff0c;如下图&#xff1a;…

Ubuntu18.04安装Ipopt-3.12.8流程

本文主要介绍在Ubuntu18.04中安装Ipopt库的流程&#xff0c;及过程报错的解决方法&#xff0c;已经有很多关于Ipopt安装的博客&#xff0c;但经过我的测试&#xff0c;很多都失效了&#xff0c;经过探索&#xff0c;找到可流畅的安装Ipopt的方法&#xff0c;总结成本篇博客。 …

【备忘录】软件记录

Anaconda 虚拟环境 创建Python环境 Spyder Python程序编辑 Jupyter Notebook 交互式开发环境