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 函数, 这些就是系统提供的接口, 当调用这些系统调用时, 就会发生用户态到内核态的转换, 当执行完系统调用后, 就会从内核态转换为用户态.

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

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

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

相关文章

IntelliJ IDEA中Maven项目的配置、创建与导入全攻略

大家好&#xff0c;我是袁庭新。 IntelliJ IDEA是当前最流行的Java IDE&#xff08;集成开发环境&#xff09;之一&#xff0c;也是业界公认最好用的Java开发工具之一。IntelliJ IDEA支持Maven的全部功能&#xff0c;通过它我们可以很轻松地实现创建Maven项目、导入Maven项目、…

深度学习笔记11-优化器对比实验(Tensorflow)

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 一、导入数据并检查 二、配置数据集 三、数据可视化 四、构建模型 五、训练模型 六、模型对比评估 七、总结 一、导入数据并检查 import pathlib,…

JavaEE之定时器及自我实现

在生活当中&#xff0c;有很多事情&#xff0c;我们不是立马就去做&#xff0c;而是在规定了时间之后&#xff0c;在到该时间时&#xff0c;再去执行&#xff0c;比如&#xff1a;闹钟、定时关机等等&#xff0c;在程序的世界中&#xff0c;有些代码也不是立刻执行&#xff0c;…

Qt学习笔记第81到90讲

第81讲 串口调试助手实现自动发送 为这个名叫“定时发送”的QCheckBox编写槽函数。 想要做出定时发送的效果&#xff0c;必须引入QT框架下的毫秒级定时器QTimer&#xff0c;查阅手册了解详情。 在widget.h内添加新的私有成员变量&#xff1a; QTimer *timer; 在widget类的构造…

【LeetCode】力扣刷题热题100道(16-20题)附源码 容器 子数组 数组 连续序列 三数之和(C++)

目录 1.盛最多水的容器 2.和为K的子数组 3.最大子数组和 4.最长连续序列 5.三数之和 1.盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴…

AI多模态技术介绍:视觉语言模型(VLMs)指南

本文作者&#xff1a;AIGCmagic社区 刘一手 AI多模态全栈学习路线 在本文中&#xff0c;我们将探讨用于开发视觉语言模型&#xff08;Vision Language Models&#xff0c;以下简称VLMs&#xff09;的架构、评估策略和主流数据集&#xff0c;以及该领域的关键挑战和未来趋势。通…

jenkins入门13--pipeline

Jenkins-pipeline(1)-基础 为什么要使用pipeline 代码&#xff1a;pipeline 以代码的形式实现&#xff0c;通过被捡入源代码控制&#xff0c; 使团队能够编译&#xff0c;审查和迭代其cd流程 可连续性&#xff1a;jenkins 重启 或者中断后都不会影响pipeline job 停顿&#x…

【线性代数】通俗理解特征向量与特征值

这一块在线性代数中属于重点且较难理解的内容&#xff0c;下面仅个人学习过程中的体会&#xff0c;错误之处欢迎指出&#xff0c;有更简洁易懂的理解方式也欢迎留言学习。 文章目录 概念计算几何直观理解意义PS.适用 概念 矩阵本身就是一个线性变换&#xff0c;对一个空间中的…

SQL多表联查、自定义函数(字符串分割split)、xml格式输出

记录一个报表的统计&#xff0c;大概内容如下&#xff1a; 多表联查涉及的报表有&#xff1a;房间表、买家表、合同表、交易表、费用表、修改记录表 注意&#xff1a;本项目数据库使用的是sqlserver&#xff08;mssql&#xff09;&#xff0c;非mysql。 难点1:业主信息&#…

python学opencv|读取图像(三十)使用cv2.getAffineTransform()函数倾斜拉伸图像

【1】引言 前序已经学习了如何平移和旋转缩放图像&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;二十七&#xff09;使用cv2.warpAffine&#xff08;&#xff09;函数平移图像-CSDN博客 python学opencv|读取图像&#xff08;二十八&#xff0…

C语言数据结构与算法(排序)详细版

大家好&#xff0c;欢迎来到“干货”小仓库&#xff01;&#xff01; 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;无人扶我青云志&#xff0c;我自踏雪至山巅&#xff01;&#xff01;&am…

【竞技宝】CS2:HLTV2024选手排名TOP4-NiKo

北京时间2025年1月11日,HLTV年度选手排名正在持续公布中,今日凌晨正式公布了今年的TOP4选手为G2(目前已转为至Falcons)战队的NiKo。 选手简介 NiKo是一名来自波黑的CS职业选手,现年26岁。作为DOTA2饱负盛名的职业选手,NiKo在CS1.6时代就已经开始征战职业赛场。2012年,年仅15岁…

IOS界面传值-OC

1、页面跳转 由 ViewController 页面跳转至 NextViewController 页面 &#xff08;1&#xff09;ViewController ViewController.h #import <UIKit/UIKit.h>interface ViewController : UIViewControllerend ViewController.m #import "ViewController.h" …

树的模拟实现

一.链式前向星 所谓链式前向星&#xff0c;就是用链表的方式实现树。其中的链表是用数组模拟实现的链表。 首先我们需要创建一个足够大的数组h&#xff0c;作为所有结点的哨兵位。创建两个足够大的数组e和ne&#xff0c;一个作为数据域&#xff0c;一个作为指针域。创建一个变…

【ArcGIS微课1000例】0138:ArcGIS栅格数据每个像元值转为Excel文本进行统计分析、做图表

本文讲述在ArcGIS中,以globeland30数据为例,将栅格数据每个像元值转为Excel文本,便于在Excel中进行统计分析。 文章目录 一、加载globeland30数据二、栅格转点三、像元值提取至点四、Excel打开一、加载globeland30数据 打开配套实验数据包中的0138.rar中的tif格式栅格土地覆…

Redis集群模式下主从复制和哨兵模式

Redis主从复制是由一个Redis服务器或实例(主节点)来控制一个Redis服务器或实例(从节点),从节点从主节点获取数据更新数据 集群模式下主从数据复制过程 从服务器连接到主服务器,发送SYNC命令。主服务器接收到SYNC命令后,开始执行BGSAVE命令生成RDB文件。主服务器BGSAVE执…

高难度下的一闪---白金ACT游戏设计思想的一点体会

1、以前光环的开发者好像提出过一个理论&#xff0c;大意是游戏要让玩家保持30秒的循环&#xff0c; 持续下去。大意跟后来的心流接近。 2、根据我自身的开发体会&#xff0c;想要保持正回路&#xff0c;并不容易。 一个是要保持适当的挑战性&#xff0c;毫无难度的低幼式玩法…

页面滚动下拉时,元素变为fixed浮动,上拉到顶部时恢复原状,js代码以视频示例

页面滚动下拉时,元素变为fixed浮动js代码 以视频示例 <style>video{width:100%;height:auto}.div2,#float1{position:fixed;_position:absolute;top:45px;right:0; z-index:250;}button{float:right;display:block;margin:5px} </style><section id"abou…

算法题(32):三数之和

审题&#xff1a; 需要我们找到满足以下三个条件的所有三元组&#xff0c;并存在二维数组中返回 1.三个元素相加为0 2.三个元素的下标不可相同 3.三元组的元素不可完全相同 思路&#xff1a; 混乱的数据不利于进行操作&#xff0c;所以我们先进行排序 我们可以采取枚举的方法进…

科研绘图系列:R语言绘制Y轴截断分组柱状图(y-axis break bar plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍特点意义加载R包数据下载导入数据数据预处理画图输出总结系统信息介绍 Y轴截断分组柱状图是一种特殊的柱状图,其特点是Y轴的刻度被截断,即在某个范围内省略了部分刻度。这种图表…