【Linux】信号(二)

news2024/11/25 2:28:11

上一章节我们进行了信号产生的讲解。
在这里插入图片描述
本节将围绕信号保存展开。

目录

  • 信号保存:
    • 信号的一些概念:
    • 关于信号保存的接口:
      • 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
在这里插入图片描述
现象:
在这里插入图片描述


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

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

现象:
在这里插入图片描述
现在我们只剩最后一个问题就完成了对信号保存的学习。

当执行完信号后,pending位图也要被清零,那么是在执行handler前清零还是执行handler后清零?
我们做一个小测试即可。
在handler中进行打印一下pending位图即可

代码:
在这里插入图片描述
现象:
在这里插入图片描述

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

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

相关文章

Macbook M芯片JDK的安装

Macbook M芯片JDK的安装 下载 搜索zulu&#xff1b; 进入这个网址 https://www.azul.com/downloads/#zulu 进入页面后向下滑动 选择对应选项 然后点击Download进行下载。 选择.dmg格式的安装包&#xff0c;点击。 安装 下载完成后&#xff0c;到下载目录&#xff0c;双击…

日进2000,我怎么做到的

昨天遇到一个有意思的项目&#xff0c;让我一天进账2000&#xff0c;一个字&#xff1a;爽。 这几天接洽了一位新客户&#xff0c;主要诉求就是优化系统&#xff0c;基于LNMP的系统优化。正好这个领域我比较熟悉&#xff0c;以前都是在公司做项目&#xff0c;也不怎么涉猎系统优…

LabVIEW硬件与仿真双模式设计液压系统

在实际项目中&#xff0c;结合LabVIEW与液压运动控制器&#xff0c;通过设计两种运行方式&#xff1a;硬件运行和仿真运行&#xff0c;使得系统既能进行实际操作又能进行仿真测试。此设计不仅方便了开发调试&#xff0c;也为教学培训和展示提供了极大的便利。本文将从项目背景、…

【优选算法】栈 {后缀表达式求值;中缀转后缀表达式;中缀表达式求值}

一、经验总结 何时使用栈结构解题&#xff1f; 做过相似的使用栈结构解得的题目嵌套处理&#xff1a;在从前向后处理的过程中&#xff0c;由于之后内容的不确定性而导致当前操作不能贸然进行&#xff0c;需要先进行保存&#xff0c;直到遇到区间结束标志&#xff08;如’)&am…

MLU370-M8 chattts-ui快速出击

目录 一、paas平台环境选择二、代码环境准备1.代码下载2.环境安装modelsopetransformersaccelerate 3.常规pip安装4.代码修改4.代码修改 三.算法启动 一、paas平台环境选择 驱动选择&#xff1a;5.10.22及以上 镜像选择&#xff1a;pytorch2.1 二、代码环境准备 1.代码下载…

HC-SR505人体感应灯

1硬件 1.1硬件组成 1.正点原子探索者开发板 2 HC-SR505迷你小型人体感应模块 3 继电器&#xff0b;5V小灯 HC-SR505迷你小型人体感应模块介绍 1.2 硬件连接 1.HC-SR505&#xff08;连接在PE0&#xff09; 2.继电器&#xff08;连接在PE1&#xff09; 2.主要代码 int ma…

【Stable Diffusion】(基础篇一)—— Stable Diffusion的安装

本系列笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili **Stable Diffusion&#xff08;简称…

SpringCloud Gateway中Filters详细说明

前面 https://blog.csdn.net/J080624/article/details/139494909 我们研究了GateWay中各种路由断言的使用。SpringCloud GateWay 还提供了各种过滤器用来对请求和响应进行处理。 官网地址&#xff1a;SpringCloud Gateway Filter 【1】GatewayFilter Factories 路由过滤器允…

前端修改接口返回测试工具 Inssman使用教程

之前用的requestly现在要登录才能用了&#xff0c;然后我又登录不上去&#xff0c;同事又推荐了个谷歌插件&#xff0c;试了下&#xff0c;挺好用&#xff0c;还不用登录&#xff0c;用法和之前差不多 下载网站&#xff1a;https://chromewebstore.google.com/detail/inssman-…

【网络安全】【深度学习】【入侵检测】SDN模拟网络入侵攻击并检测,实时检测,深度学习

文章目录 1. 前言2. Mininet 和 Ryu 的区别2.1 Mininet2.2 Ryu2.3 总结 3. 模拟攻击3.1 环境准备3.2 创建 Mininet 网络拓扑3.2 启动 Ryu 控制器3.3 模拟网络攻击3.4 捕获流量 4. 实时异常检测4.1 在 Ryu 控制器中4.2 在 h2 机器上的实验结果4.3 深度学习模型部署上h2机器 帮助…

OrangePi Kunpeng Pro深度评测:性能与体验的完美融合

文章目录 一、引言二、硬件开箱与介绍1.硬件清单2.硬件介绍 三、软件介绍四、性能测试1. 功率测试2. cpu测试2.1 单线程cpu测试2.2 多线程cpu测试 五、实际开发体验1. 搭建API服务器2. ONNX推理测试3. 在线推理平台 五、测评总结1. 能与硬件配置2. 系统与软件3. 实际开发体验个…

[Kubernetes] 容器运行时 Container Runtime

文章目录 1.容器运行时(Container Runtime)2.容器运行时接口3.容器运行时层级4.容器运行时比较5.强隔离容器6.K8S为何难以实现真正的多租户 1.容器运行时(Container Runtime) Container Runtime 是运行于 k8s 集群每个节点中&#xff0c;负责容器的整个生命周期。Docker 就目前…

Redis的删除策略与内存淘汰

文章目录 删除策略设置过期时间的常用命令过期删除策略 内存淘汰相关设置LRU算法LFU 总结 在redis使用过程中&#xff0c;常常遇到以下问题&#xff1a; 如何设置Redis键的过期时间&#xff1f;设置完一个键的过期时间后&#xff0c;到了这个时间&#xff0c;这个键还能获取到么…

Foxmail邮箱的使用方法和功能最全介绍

Foxmail邮箱是我们办公邮箱中比较有代表性和使用性的一款邮箱软件&#xff0c;今天笔者为大家介绍一下Foxmail邮箱的功能和使用方法。 1、首先我们从安装Foxmail邮箱开始 2、点击安装等待安装成功 3、双击打开 &#xff0c;出现邮箱设置界面输入我们的账号密码&#xff0c;点击…

ESP32:往MicroPython集成PCNT以支持硬件正交编码器

背景 官方发布的1.23依然没有在ESP32中集成PCNT功能。考虑到硬件的PCNT模块可以提供4倍的编码精度&#xff08;对比使用PIn IRQ&#xff09;&#xff0c;还能提供硬件去毛刺。 还是自己集成一下吧。 实际上Github上早在2022年1月的时候就已经有人建议了将PCNT加入正式版本的功…

家庭电脑私网如何访问阿里云服务器的指定端口

这里我们以在阿里云服务器上部署一个redis server 服务&#xff0c;对外开放6379端口为例子&#xff0c;其他端口类似。 1.获取当前电脑主机对应的公网IP, 可以https://tool.lu/ip/通过这个网站拿到。 2.阿里云服务器控制台设置防火墙&#xff0c;如下图所示&#xff0c;直接添…

【leetcode22-36】链表

160.相交链表 【等比例法】 class Solution:def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:if not headA or not headB:return NonepointA headApointB headBwhile pointA ! pointB:pointA pointA.next if pointA else headB …

五、身份与访问管理—身份管理和访问控制管理(CISSP)

目录 1.身份管理 1.1 目录技术 1.2 单点登录 1.2.1 Kerberos认证 1.2.2 SESAME认证 1.2.3 KryptoKnight认证 1.3 联合身份管理 1.3.1 SAML安全断言标记语言 1.3.2 标记语言 1.3.3 OpenID 1.3.4 OAuth 1.3.5 OIDC(OpenID Connect) 2.身份即服务(IDaaS) 2.1 AA…

【CS.SE】端午节特辑:Docker容器化技术详解与实战

端午节, 先祝愿大家端午安康&#xff0c;阖家幸福, 哈哈&#xff01;这篇讲下Docker这一现代软件开发中不可或缺的技术。软件工程涉及软件开发的整个生命周期&#xff0c;包括需求分析、设计、构建、测试、部署和维护。Docker作为一种容器化技术&#xff0c;直接关联到软件部署…

基于springboot开发的Java MES制造执行系统源码,全套源码,一款数字化管理平台源码 云MES系统源码

基于springboot开发的Java MES制造执行系统源码&#xff0c;全套源码&#xff0c;一款数字化管理平台源码 云MES系统源码 MES系统源码相关技术&#xff1a; ​技术架构&#xff1a;springboot vue-element-plus-admin 开发语言&#xff1a;Java 开发工具&#xff1a;idea 前…