【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.hqwc.cn/news/224849.html

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

相关文章

深度学习18

卷积层 查看每个数据 使用tensorboard查看 池化层 使用数据集进行训练 创建实例,使用tensorboard进行显示 最大池化保留了图片信息,神经网络训练的数据量大大减小,可以加快训练 非线性激活 非线性激活为神经网络加入了一些非线性的特质…

【密码学】【安全多方计算】浅析隐私求交PSI

文章目录 隐私求交的定义隐私求交方案介绍1. 基于DH的PSI方案2. 基于OT的PSI方案3.基于OPRF的PSI方案 总结 隐私求交的定义 隐私集合求交使得持有数据参与方通过计算得到集合的交集数据,而不泄露任何交集以外的数据信息。 隐私求交方案介绍 1. 基于DH的PSI方案 …

linux查看emmc分区信息(10种方法 )

目录 ## 1 emmc ## 2 uboot查看 ## 3 kernel查看 方法1 方法2 方法3 方法4 方法5 方法6 方法7 方法8 方法9 方法10 ## 1 emmc 我们要说的是,User Data Partition中的再分区 可简化为 ## 2 uboot查看 u-boot> mmc partPartition Map for MMC device…

(Linux2.6内核)进程调度队列与切换

个人主页:Lei宝啊 愿所有美好如期而遇 我们首先来了解几个概念 1. 进程在CPU上运行的时候,一定要运行完才行吗?答案是否定的,我们大部分的操作系统,主流就是分时操作系统,即基于时间片进程轮转执行的。 …

Ubuntu18.04磁盘取证-中难度篇

涉及的镜像文件: sdb.vhd uac.tar ubuntu.20211208.mem 需要利用的工具: volatility3 volatility2.6.1 FTK/Autopsy Strings 题干 容器是一个Ubuntu Linux 蜜罐,用来观察利用 CVE-2021-41773 的漏洞攻击者想要做什么。 您将看到一个 cr…

SIT65HVD75,可替代SN65HVD75,3.0~5.5V 供电,ESD 15kV HBM,20Mbps 半双工 RS485/RS422 收发器

SIT65HVD75 是一款 3.0V~5.5V 电源供电、总线端口 ESD 保护能力 HBM 达到 15kV 以上、 总线耐压范围达到 15V 、半双工、低功耗,功能完全满足 TIA/EIA-485 标准要求的 RS-485 收发 器。 SIT65HVD75 包括一个驱动器和一个接收器,两者均可…

【Java学习笔记】72 - 满汉楼 - 餐饮管理系统

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter26 一、需求说明 满汉楼项目功能多,界面复杂,涉及到复杂的awt和swing技术和事件编程,做如下调整: 1.去掉界面和事件处理(工作中使用很少),使…

小程序如何进行版本回退

当商家决定回退小程序版本时,可能是因为新版本出现了一些问题或者不符合预期,需要恢复到之前的稳定版本。下面具体介绍怎么回退小程序的版本。 在小程序管理员后台->版本设置处,点击版本回退。确认后,小程序会回退到上一次的版…

视频封面:视频图片提取技巧,从指定时长中捕捉需求的图片

在当今的数字时代,视频已成为日常生活中不可或缺的一部分。无论是社交媒体、博客,视频都发挥着重要的作用。而一个吸引的视频封面往往能吸引更多的观众点击观看,选择清晰度高、色彩鲜艳且能吸引人的图片。同时,确保图片与视频内容…

零基础可以学编程吗,不懂英语怎么学编程,中文编程工具实例

零基础可以学编程吗,不懂英语怎么学编程,中文编程工具实例 上图是中文编程工具界面、标尺实例。 给大家分享一款中文编程工具,零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件&#x…

【jupyter notebook中插件 nbextensions 安装失败分析与解决方法】

文章目录 问题描述分析与解决总结 问题描述 一开始在安装 notebook 中的插件 nbextensions 时根本没有注意到版本的适配问题,都是进行默认的安装,结果安装是最新版本的 notebook7.x,恰好 notebook7.x 版本不再适应插件 nbextensions&#xf…

机器学习——多元线性回归升维

机器学习升维 升维使用sklearn库实现特征升维实现天猫年度销量预测实现中国人寿保险预测 升维 定义:将原始的数据表示从低维空间映射到高维空间。在线性回归中,升维通常是通过引入额外的特征来实现的,目的是为了更好地捕捉数据的复杂性&#…