Linux 下信号的保存和处理

信号的几个状态

  1. 信号抵达: 当接收到的信号被处理时, 此时就成为信号的抵达
  2. 信号的未决: 从信号的产生到信号抵达这个时间段之间, 称为信号未决
  3. 信号阻塞: 当进程设置了某个信号为阻塞后, 这个进程就不会在接收到这个信号
  4. 信号忽略: 将信号设置为忽略后, 接收到这个信号, 对这个信号的处理就是忽略

阻塞和忽略:

阻塞是进程没有收到对应的信号, 所以没有任何处理.

忽略接收到了信号, 但是对这个信号的处理就是不做任何处理, 进行忽视

虽然两者的行为是一样的, 没有任何处理, 但是本质还是有差别的

信号的保存

进程要对对接收到的信号处理, 那么就需要存在一块空间来存储接收到的信号.

在进程 PCB 中会存在三张表

1. block 表

block 表实际上是一个位图, 每一个比特位都对应一个信号.

信号对应比特位上要么是0, 要么是1.

1则代表在这个进程中, 这个比特位对应的信号设置为阻塞. 进程不接受此信号.

所以这张表也称为信号屏蔽字

2. pending 表

pending 表也是一个位图, 用来记录进程是否接收到了比特位对应的信号.

比特位为0表示没有接收到了对应位的信号. 为1表示接收到对应的信号.

这张表也可以称为未决表, 因为其中记录的信号都还未处理.

3. handler 表

handler 表和前两个表不同, handler 表是一个数组. 准确来说是一个函数指针数组.

这个表中记录着对应信号的处理函数地址. 当接收到信号时就会去调用对应的处理函数.

在上面的信号状态中, 有一个信号忽略, 实际上就是将 handler 表中的对应信号的函数指针设置为"SIG_IGN". SIG_IGN 是一个宏, 本质还是一个函数指针.

信号的一些操作

上面讲了信号存在阻塞状态, 还存在忽略状态. 除了系统默认的初始配置, 我们也可以手动进行设置.

1. 阻塞信号的设置

上面了解到阻塞表 (block) 是一个位图. 所以需要先来了解一下位图的使用.

sigset_t 类型就是位图

int sigemptyset(sigset_t *set) // 将每一个比特位都设置为 0

int sigfillset(sigset_t *set); // 将每一个比特位都设置为 1

int sigaddset(sigset_t *set, int signum); // 将第 signum 比特位设置为 1

int sigdelset(sigset_t *set, int signum); // 将第 signum 比特位设置为 0

int sigismember(const sigset_t *set, int signum); // 判断第 signum 比特位是0还是1并返回

当设置好了位图后, 使用函数 sigprocmask 来设置阻塞表

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

  • how:指定如何修改信号阻塞集,可以取以下值:
    • SIG_BLOCK:将 set 中的信号添加到当前信号阻塞集中。
    • SIG_UNBLOCK:将 set 中的信号从当前信号阻塞集中删除。
    • SIG_SETMASK:将当前信号阻塞集设置为 set
  • set:指向 sigset_t 类型的指针,表示要修改的信号集。
  • oldset:指向 sigset_t 类型的指针,用于存储修改前的信号阻塞集。如果不需要,可以传 NULL

返回值:

  • 成功时返回 0。
  • 失败时返回 -1.
int main()
{sigset_t myset;sigemptyset(&myset);sigaddset(&myset, 1);sigprocmask(SIG_BLOCK, &myset, NULL);// 将本进程的一号信号设置为阻塞return 0;
}

2. 信号处理函数设置

接下来我们来设置对于信号的处理函数.

我们需要使用 signal 函数.

signum: 要设置几号信号的处理函数, 可以使用数字, 也可以使用信号名如: SIGINT

  • SIG_DFL:恢复信号的默认处理行为。
  • SIG_IGN:忽略信号。
  • 自定义处理函数:用户定义的处理函数指针。

handler: 接收到信号时, 要调用的处理函数

void func(int signum) // 参数不能省略
{cout << "接收到信号: " << signum << endl;
}int main()
{signal(1, func);// 当进程接收到 1 号信号时, 就会调用函数 func, 进程就会打印信息return 0;
}

信号的处理时机

从内核态返回用户态时, 会进行信号的处理

内核态和用户态都是操作系统的一种运行状态.

用户态拥有的权限较低, 只能访问自己的地址空间, 不能直接访问内核空间.

内核态拥有最高的权限, 可以访问系统的任何资源, 执行所有操作.

区分用户态和内核态是对操作系统的一种保护方式, 可以防止用户程序对系统资源的非法访问. 保护系统的稳定和安全.

那么什么时候会发生用户态和内核态之间的转换

系统调用, 如: 使用 read, write 函数, 这些就是系统提供的接口, 当调用这些系统调用时, 就会发生用户态到内核态的转换, 当执行完系统调用后, 就会从内核态转换为用户态.

此时, 就会对进程接收到的信号处理.

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

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

相关文章

mybatisX插件的使用,以及打包成配置

装mybatisX插件&#xff1b; idea连接数据库&#xff1b; 点击mybatisx-generator&#xff0c;设置自己装mybatisX插件&#xff1b; idea连接数据库&#xff1b; 点击mybatisx-generator&#xff0c;设置自己要的包和类&#xff1b; 如果要把自己的配置设置成一个自定义模板&a…

AAAI2023《Controllable Image Captioning via Prompting》

摘要 文章提出了一种通过提示学习&#xff08;prompt learning&#xff09;嵌入到图像描述生成框架中的方法&#xff0c;以实现对图像描述的可控生成。具体来说&#xff0c;设计了一组提示来微调预训练的图像描述生成器&#xff0c;这些提示使模型能够吸收来自不同领域的风格化…

AR 眼镜之-拍照/录像动效切换-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 拍照/录像动效切换 1. &#x1f531; 技术方案 1.1 技术方案概述 1.2 实现方案 1&#xff09;第一阶段动效 2&#xff09;第二阶段动效 2. &#x1f4a0; 默认代码配置 2.1 XML 初始布局 2.2 监听滑动对 View 改变 3. ⚛️…

kubeneters-循序渐进Cilium网络(二)

文章目录 概要IP 地址配置接口配置解析结论 概要 接续前一章节&#xff0c;我们还是以这张图继续深入Cilium网络世界 IP 地址配置 通过检查 Kubernetes 集群的当前环境&#xff0c;可以获取实际的 IP 地址和配置信息。这些信息将被补充到之前的网络示意图中&#xff0c;以使…

宝塔安装mongodb后,写脚本监控运行状态,关闭后自动重启

最近项目用上了mongodb&#xff0c;但是每天晚上 mongodb都回自动关闭&#xff0c;没办法 只能写个监视服务的脚本 在关闭的话就直接重启&#xff0c;创建个计划任务&#xff0c;每三分钟执行一次 # 检查mongo是否还在进程中 countps aux|grep mongo| grep -v grep |wc -l echo…

备忘录记事工具 四款好用的电脑备忘录记事本分享

在信息爆炸的时代&#xff0c;选择一个合适的备忘录记事工具显得尤为重要。无论是记录工作上的重要事项、学习笔记还是生活中的点滴灵感&#xff0c;一个好的备忘录应用都能成为您得力的小助手。今天&#xff0c;我将为大家深入评测四款各具特色的电脑备忘录记事本软件。 印象…

深入理解 C 语言中浮点型数据在内存中的存储

文章目录 一、浮点型数据存储格式&#xff08;IEEE 754 标准&#xff09;二、举例说明单精度浮点数存储过程三、绘图说明四、双精度浮点数存储示例&#xff08;以1.5为例&#xff09; 在 C 语言的世界里&#xff0c;数据类型丰富多样&#xff0c;而浮点型数据用于表示实数&…

sql server cdc漏扫数据

SQL Server的CDC指的是“变更数据捕获”&#xff08;Change Data Capture&#xff09;。这是SQL Server数据库提供的一项功能&#xff0c;能够跟踪并记录对数据库表中数据所做的更改。这些更改包括插入、更新和删除操作。CDC可以捕获这些变更的详细信息&#xff0c;并使这些信息…

vue3如何使用bus(事件总线)

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f9…

Spring IoC DI 入门 和 使用

Spring IoC & DI入门 和 使用 1. IoC & DI入门1.1 Spring 是什么?1.1.1 什么是容器?1.1.2 什么是IoC? 1.2 IoC介绍1.2.1 传统程序开发1.2.2 问题分析1.2.3 解决方案1.2.4 IoC程序开发1.2.5 IoC优势 1.3 DI介绍 2. IoC 和 DI使用 1. IoC & DI入门 1.1 Spring 是…

计算机网络(三)——局域网和广域网

一、局域网 特点&#xff1a;覆盖较小的地理范围&#xff1b;具有较低的时延和误码率&#xff1b;使用双绞线、同轴电缆、光纤传输&#xff0c;传输效率高&#xff1b;局域网内各节点之间采用以帧为单位的数据传输&#xff1b;支持单播、广播和多播&#xff08;单播指点对点通信…

mapbox基础,style样式汇总,持续更新

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;mapbox 从入门到精通 文章目录 一、&#x1f340;前言二、&#x1f340;根属性2.1 so…

551 灌溉

常规解法&#xff1a; #include<bits/stdc.h> using namespace std; int n,m,k,t; const int N105; bool a[N][N],b[N][N]; int cnt; //设置滚动数组来存贮当前和下一状态的条件 //处理传播扩散问题非常有效int main() {cin>>n>>m>>t;for(int i1;i&l…

jenkins入门10--自动化构建

build periodically&#xff1a;设定类似cron周期性时间触发构建 * * * * * (五颗星&#xff0c;中间用空格隔开&#xff09; 第一颗表示分钟&#xff0c;取值0~59 第二颗表示小时&#xff0c;取值0~23 第三颗表示一个月的第几天&#xff0c;取值1~31 第四颗表示第几月&#xf…

[0405].第05节:搭建Redis主从架构

Redis学习大纲 一、3主3从的集群配置&#xff1a; 1.1.集群规划 1.分片集群需要的节点数量较多&#xff0c;这里我们搭建一个最小的分片集群&#xff0c;包含3个master节点&#xff0c;每个master包含一个slave节点&#xff0c;结构如下&#xff1a; 2.每组是一主一从&#x…

新兴的开源 AI Agent 智能体全景技术栈

新兴的开源 AI Agent 智能体全景技术栈 LLMs&#xff1a;开源大模型嵌入模型&#xff1a;开源嵌入模型模型的访问和部署&#xff1a;Ollama数据存储和检索&#xff1a;PostgreSQL, pgvector 和 pgai后端&#xff1a;FastAPI前端&#xff1a;NextJS缺失的一环&#xff1a;评估和…

详细分析 Git 分支重命名与同步操作

目录 前言1. 场景2. 扩展知识 前言 以下小知识点作为讲解介绍&#xff0c;文章较短&#xff0c;作为科普使用 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 1. 场景 示例场景&#xff1a;决定将默认分支从 main…

vs2022开发.net窗体应用开发环境安装配置以及程序发布详细教程

文章目录 一、安装visual studio1.1推荐win10操作系统1.2推荐vs20221.3选择工作负载 二、新建基于.net的winform应用程序2.1为什么要.net 2.2 新建.net窗体应用2.2.1 选择Window窗体应用2.2.2 .net窗体对比framework窗体 三、发布.net应用 一、安装visual studio 1.1推荐win10…

Python基于YOLOv8和OpenCV实现车道线和车辆检测

使用YOLOv8&#xff08;You Only Look Once&#xff09;和OpenCV实现车道线和车辆检测&#xff0c;目标是创建一个可以检测道路上的车道并识别车辆的系统&#xff0c;并估计它们与摄像头的距离。该项目结合了计算机视觉技术和深度学习物体检测。 1、系统主要功能 车道检测&am…

详解Sonar与Jenkins 的集成使用!

本文阅读前提 本文假设读者熟悉Jenkins和SonarQube的基础操作。 核心实现功能 Jenkins中运行的job来调用SonarScanner&#xff0c;最后可实现测试结果与SonarQube中同步查看。 Jenkins中安装Sonar相关插件 配置Sonarqube Dashboard>Manage Jenkins>Systems 指定son…