【Linux】信号(二)

上一章节我们进行了信号产生的讲解。
在这里插入图片描述
本节将围绕信号保存展开,并会将处理部分开一个头。

目录

  • 信号保存:
    • 信号的一些概念:
    • 关于信号保存的接口:
      • sigset_t的解释:
      • 对应的操作接口:
      • sigprocmask:
      • sigpending:
      • 代码实践:

信号保存:

信号的一些概念:

  • 实际执行信号的处理动作称为信号递达(Delivery)
  • 信号从产生到递达之间的状态,称为信号未决(Pending)。
  • 进程可以选择阻塞 (Block )某个信号。

对于递达:也就是我们之前一直在说的处理,仍然是3种处理方法

  1. 默认行为 2. 忽略行为 3. 自定义行为

对于未决:是信号产生到递达之间的状态。

对于阻塞:当我们阻塞一个信号,信号一旦产生,永不递达,知道解除阻塞状态。

那么现在我们要进行一个概念的区分。
一个信号如果阻塞和他是否未决有关系吗?
这就像你讨厌一个老师(阻塞),你不会做他布置的作业(递达),但是并不妨碍你将作业记下来(未决)。所以其实是没关系的!

但以上都只是概念
我们要继续深入原理:
我们之前说过发信号实际就是在task_struct中进行pending位图的修改,但除了pending我们还有一个block位图与一张hanler表。

block对应阻塞,pending对应未决,handler对应递达。
在这里插入图片描述


既然我们最熟悉pending,那么就先从pending开始。
我们说过pending是一张位图。

0000 0000 0000 0000 0000 0000 0000 0000
第0个比特位不用,比特位的位置代表信号编号。
比特位的内容代表信号是否收到。


再来看handler表。
提到handler表我们又要把signal函数拿出来在这里插入图片描述
handler表的每个元素实际就是在这里插入图片描述
这个类型的函数指针。
我们使用signal时,实际上就是在修改handler表,将信号编号直接对应到这个数组的下标

在这里插入图片描述


最后来看block位图。
和pending是非常类似的。

0000 0000 0000 0000 0000 0000 0000 0000

比特位的位置:代表信号编号
比特位的内容:当前信号是否阻塞


所以只要有两个位图+一张表 就能让进程识别信号。

最后在补充两个概念。

  • 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作.
  • 阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。

关于信号保存的接口:

在说到接口前我们还需要铺垫一个linux提供的一个类型sigset_t。

sigset_t的解释:

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

linux中定义为下:
在这里插入图片描述
我们先自己模拟一个位图便于理解sigset_t。
在这里插入图片描述
同样,我们不推荐自己操作位图,因为不同系统位图的结构可能不同,就不能正确的运行,因此,OS也提供了一批函数进行操作这个类型。

对应的操作接口:

#include <signal.h>
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset (sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);
int sigismember(const sigset_t *set, int signo);

函数sigemptyset初始化set所指向的信号集,使其中所有信号的对应bit清零,表示该信号集不包含 任何有效信号。

函数sigfillset初始化set所指向的信号集,使其中所有信号的对应bit置位,表示 该信号集的有效信号包括系统支持的所有信号。

注意,在使用sigset_ t类型的变量之前,一定要调 用sigemptyset或sigfillset做初始化,使信号集处于确定的状态。初始化sigset_t变量之后就可以在调用sigaddset和sigdelset在该信号集中添加或删除某种有效信号。

这四个函数都是成功返回0,出错返回-1。sigismember是一个布尔函数,用于判断一个信号集的有效信号中是否包含某种 信号,若包含则返回1,不包含则返回0,出错返回-1.

我们现在知道了信号位图和对应的操作,那么怎么获得block与pending??

因为task_struct是属于内核的,所以只有OS可以进行获取与修改,所以OS就要提供对应的系统调用供我们使用。


我们先来看block的操作函数

sigprocmask:

在这里插入图片描述

参数解释:

如果oset是非空指针,则读取进程的当前信号屏蔽字通过oset参数传出。如果set是非空指针,则 更改进程的信号屏蔽字,参数how指示如何更改。如果oset和set都是非空指针,则先将原来的信号 屏蔽字备份到oset里,然后根据set和how参数更改信号屏蔽字。假设当前的信号屏蔽字为mask,下表说明了how参数的可选值。

在这里插入图片描述

如果调用sigprocmask解除了对当前若干个未决信号的阻塞,则在sigprocmask返回前,至少将其中一个信号递达。

sigpending:

我们对于pending位图该怎么操作呢?
实际上我们已经学完了!就是信号发送的5种方式,修改了对应的位图,那么怎么进行获取?
在这里插入图片描述
使用上图函数即可获取。

代码实践:

阶段一:


我们先将获取pending,随后对2号屏蔽,观察现象。
在这里插入图片描述

进行kill -2
在这里插入图片描述
现象:
在这里插入图片描述


阶段二:
此时我们再尝试恢复一下对二号信号。
但要捕捉一下,否则解除屏蔽的瞬间就直接进行终止了。

改动后的代码:
在这里插入图片描述

现象:
在这里插入图片描述
持续更新…

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

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

相关文章

SwiftUI中Preference的理解与使用(ScrollView偏移量示例)

在 SwiftUI 中&#xff0c;Preference用于从视图层次结构的较深层次向上传递信息到较浅层次。这通常用于在父视图中获取子视图的属性或状态&#xff0c;而不需要使用状态管理工具如State或 ObservableObject。Preference特别用于自定义布局或组件&#xff0c;其中子视图需要向父…

Git 和 Github 的使用

补充内容&#xff1a;EasyHPC - Git入门教程【笔记】 文章目录 常用命令配置信息分支管理管理仓库 概念理解SSH 密钥HTTPS 和 SSH 的区别在本地生成 SSH key在 Github 上添加 SSH key 使用的例子同步本地仓库的修改到远程仓库拉取远程仓库的修改到本地仓库拉取远程仓库的分支并…

千益畅行:合法合规的旅游卡服务,真实可靠的旅游体验

近期&#xff0c;关于千益畅行旅游卡服务的讨论引起了广泛关注。然而&#xff0c;网络上出现了一些对其误解和质疑的声音。为了澄清事实&#xff0c;我们深入了解了千益畅行的运营模式和业务特点&#xff0c;发现它是一家合法合规的旅游卡服务提供商&#xff0c;为消费者提供真…

Eslint配置指南

1. Eslint配置指南 1.1. 安装 ESLint1.2. 生成配置文件1.3. 修改配置文件1.4. 创建 .eslintignore 文件1.5. 运行 ESLint1.6. 整合到编辑器/IDE1.7. 自动修复 2. 配置prettier 2.1. 安装依赖包2.2. .prettierrc.json添加规则2.3. .prettierignore忽略文件2.4. 保存自动格式化 3…

深度学习中2D分割

深度学习中的2D图像分割 2D图像分割是深度学习中的一个重要任务&#xff0c;旨在将图像划分为不同的区域&#xff0c;每个区域对应于图像中的不同对象或背景。该任务广泛应用于医学影像分析、自动驾驶、卫星图像分析等领域。以下是对深度学习中2D图像分割的详细介绍&#xff0…

实战 | 通过微调SegFormer改进车道检测效果(数据集 + 源码)

背景介绍 SegFormer&#xff1a;实例分割在自动驾驶汽车技术的快速发展中发挥了关键作用。对于任何在道路上行驶的车辆来说&#xff0c;车道检测都是必不可少的。车道是道路上的标记&#xff0c;有助于区分道路上可行驶区域和不可行驶区域。车道检测算法有很多种&#xff0c;每…

vue2实现将el-table表格数据导出为长图片

方法一、 el-table数据导出为长图片 将el-table数据导出为图片不是一个直接的功能&#xff0c;但可以通过以下步骤实现&#xff1a; 使用html2canvas库将表格区域转换为画布(canvas)。 使用canvas的toDataURL方法将画布导出为图片格式&#xff08;例如PNG&#xff09;。 创建…

数据结构--实验

话不多说&#xff0c;直接启动&#xff01;&#x1f44c;&#x1f923; 目录 一、线性表&#x1f60e; 1、建立链表 2、插入元素 3、删除特定位置的元素 4、输出特定元素值的位置 5、输出特定位置的元素值 6、输出整个链表 实现 二、栈和队列&#x1f618; 栈 顺序栈 …

Mybatis缓存的生命周期、使用的特殊情况

以下场景均在Spring Boot程序中&#xff0c;并非手动创建SqlSession使用。 在回答这个问题之前&#xff0c;我们先来回顾一下&#xff0c;Mybatis的一级二级缓存是啥。 一级二级缓存 是什么 一级缓存&#xff08;本地缓存&#xff09;&#xff1a;一级缓存是SqlSession级别的…

将web项目打包成electron桌面端教程(一)vue3+vite+js

说明&#xff1a;后续项目需要web端和桌面端&#xff0c;为了提高开发效率&#xff0c;准备直接将web端的代码打包成桌面端&#xff0c;在此提前记录一下demo打包的过程&#xff0c;需要注意的是vue2或者vue3的打包方式各不同&#xff0c;如果你的项目不是vue3vitejs&#xff0…

数字孪生技术体系和核心能力整理

最近对数字孪生技术进行了跟踪调研学习,整理形成了调研成果,供大家参考。通过学习,发现数字孪生技术的构建过程其实就是数字孪生体的构建与应用过程,数字孪生体的构建是一个体系化的系统工程,数字化转型的最终形态应该就是数实融合互动互联的终极状态。数实融合是每个行业…

MSA算法满足条件后续之Blum定理

文章目录 引言Blum定理关于MSA算法的讨论 此文章属于文献研读内容&#xff0c;文章内容来源于以下文献 Warren B. Powell, Yosef Sheffi , (1982) The Convergence of Equilibrium Algorithms with Predetermined Step Sizes. Transportation Science ,16(1):45-55. http://dx.…

赶紧收藏!2024 年最常见 20道分布式、微服务面试题(三)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 20道分布式、微服务面试题&#xff08;二&#xff09;-CSDN博客 五、微服务架构有哪些优点和缺点&#xff1f; 微服务架构是一种设计方法&#xff0c;它将应用程序分解为一组小型、独立、松散耦合的服务。每个服务都…

[每周一更]-(第100期):介绍 goctl自动生成代码

​ 在自己组件库中&#xff0c;由于部分设计会存在重复引用各个模板的文件&#xff0c;并且基础架构中需要基础模块内容&#xff0c;就想到自动生成代码模板&#xff0c;刚好之前有使用过goctl&#xff0c;以下就简单描述下gozero中goctl场景和逻辑&#xff0c;后续自己借鉴将自…

英语学习笔记32——What‘s he/she/it doing?

What’s he/she/it doing? 他/她/它 正在做什么&#xff1f; 词汇 Vocabulary type /taɪp/ v. 打字 n. 类型&#xff0c;签字 ing形式&#xff1a;typeing 用法&#xff1a;this type of …    这种类型的…… 例句&#xff1a;我喜欢这种苹果。    I like this type…

java自学阶段二:JavaWeb开发--day80(项目实战2之苍穹外卖)

《项目案例—黑马苍穹外卖》 目录&#xff1a; 学习目标项目介绍前端环境搭建(前期直接导入老师的项目&#xff0c;后期自己敲&#xff09;后端环境搭建&#xff08;导入初始项目&#xff0c;新建仓库使用git管理项目&#xff0c;新建数据库&#xff0c;修改登录功能&#xff…

btstack协议栈---总目录

章节文章标题文章链接1.基础篇1.BLE协议栈全解一篇就够点击我2.实战篇1.Hello World example点击我2.

面试专区|【53道Java基础高频题整理(附答案背诵版)】

Java为什么被称为平台无关性语言&#xff1f; Java被称为平台无关性语言&#xff0c;是因为一旦Java代码被编译成字节码&#xff0c;这些字节码就可以在任何安装了Java虚拟机&#xff08;JVM&#xff09;的设备上运行&#xff0c;无论这个设备使用的是什么操作系统。这就是“一…

[office] 如何在Excel中拉动单元格时表头不变形- #学习方法#职场发展#经验分享

如何在Excel中拉动单元格时表头不变形? 如何在Excel中拉动单元格时表头不变形&#xff1f;Excel是我们常用的办公软件&#xff0c;当我们使用Excel拉动单元格时表头不变形&#xff0c;该如何操作呢&#xff0c;下面小编就为大家做详细讲解 如何在Excel中拉动单元格时表头不变…

用户输入表格数据设计(XPTable控件使用说明九)

XP Table控件可以编辑数据&#xff0c;程序也可以使用编辑后的数据&#xff0c;但是程序新建时又从初始化数据到模型到显示&#xff0c;这两步有点绕&#xff0c;做了一个实例来说明这块内容。 流程1&#xff1a;初始化数据--> model--> UI show 流程2&#xff1a;UI--…