Linux——信号知识归纳(中)

news2024/10/7 4:24:54

目录

一.信号与硬件异常

二.阻塞信号和信号结构

(一).信号状态

(二).信号结构

①pending表

②block表

③handler表

(三).信号处理过程

(四).阻塞与忽略的区别

(五).不可阻塞和自定义的信号

三.信号函数

①sigpending

②sigprocmask

③sigemptyset

④sigfillset

⑤sigaddset

⑥sigdelset

⑦sigismember

⑧使用示例


一.信号与硬件异常

硬件产生异常并使程序崩溃的方式有很多,比如除0错误、空指针、数组越界等。

大致上,当硬件产生异常后,会“汇报”给操作系统,再由操作系统发送相关信号给进程,促使进程异常退出。

以除0错误为例,当cpu检测到除0后,其中状态寄存器会标记异常,操作系统识别到该寄存器标记了异常后,发送信号给当前进程,进而进程崩溃退出。

再比如空指针问题,当虚拟地址为空时,页表通过MMU(硬件)映射时会出错,MMU内部寄存器会标记异常,操作系统识别后发送信号给进程,进程崩溃退出。

二.阻塞信号和信号结构

(一).信号状态

信号在发送过程中有三种状态:未决、递达、阻塞

状态含义
信号未决信号产生后,进程接收但未执行具体方法
信号递达执行信号方法的状态或正在处理信号
信号阻塞进程收到信号,但不允许递达,即不允许处理信号

如果某信号处于阻塞态,那么该信号将无法调用对应的信号函数。

(二).信号结构

首先,我们需要知道的是,信号在操作系统中以位图的形式记录,普通信号是1 - 31,正好可以使用位图对照,0代表进程此时没收到该信号,1代表收到该信号。

实际上,linux的信号有三个信号表构成,即pending表、block表、handler表

这三个表属于进程PCB结构体,记录在task_struct中。

①pending表

该表本质上是一个位图结构,记录进程是否收到该位对应的信号。0代表没有收到,1代表收到。

②block表

该表也是位图结构,每一位记载该信号是否阻塞,0代表未阻塞,1代表阻塞。

③handler表

该表是函数指针数组,数组每一个下标对应一个信号,每个下标对应的指针指向该信号的处理函数。

SIG_IGN表示处理方式为忽略。

SIG_DFL表示处理方式为默认。

比如2号信号使用默认函数可以表示为:

signal(SIGINT, SIG_IGN);

(三).信号处理过程

(四).阻塞与忽略的区别

阻塞是进程接收信号后,“故意”不执行方法。

忽略是进行接收信号后,执行了方法,但方法是忽略。

本质上,阻塞是将block表该位置1;忽略的该位为0,在handler表中记载的是SIG_IGN。

(五).不可阻塞和自定义的信号

9号信号SIGKILL、18号信号SIGCONT、19号信号SIGSTOP不可被阻塞和自定义。

换句话说,即便是手动添加阻塞信号或自定义处理方法也是无效的,依旧执行默认的方法。

三.信号函数

①sigpending

用于获取当前进程的pending表。

 操作系统中定义了sigset_t类型的数据,按位图的形式保存信号,即信号集。 

 第一个参数是输出型参数,通过该函数获得当前进程的pending位图。

返回值0代表获取成功,-1代表获取失败。

②sigprocmask

用于改变阻塞信号

 第一个参数有三个可选项:

选项含义操作
SIG_BLOCKset中所有置1的都设置成阻塞block = block | set
SIG_UNBLOCKset中所有置1的都设置成非阻塞block = block & ~set
SIG_SETMASK进程block位图表与set表一致block = set

第二个参数是输入型参数,用于确定哪些位阻塞/解除阻塞

第三个参数是输出型参数,获取旧的block位图表。

返回值含义与sigpending一致。

③sigemptyset

用于将信号集全部置0

参数为输出型参数,set内各位将置为0。

返回值含义与sigpending一致。

④sigfillset

用于将信号集全部置1

参数为输出型参数,set内各位将置为1。

返回值含义与sigpending一致。

⑤sigaddset

用于将信号集某一位设置为1

 第一个参数为输出型参数,set中指定位将置1。

第二个参数为指定的信号值。

返回值含义与sigpending一致。

⑥sigdelset

用于将信号集某一位设置为0

 参数和返回值含义与sigdelset相同,唯一不同就是该位设置为0。

⑦sigismember

用于确定信号集特定位的数值

 第一个参数为输入型参数,输入的待查看的信号集。

第二个参数为指定的信号值

返回值1代表该位为1,0代表该位为0,-1代表错误。

⑧使用示例

int main(){
    sigset_t block, oldBlock;
    //将1 - 31号信号全部阻塞
    for(int i = 1; i <= 31; i++){
        sigaddset(&block, i);
    }
    int n = sigprocmask(SIG_BLOCK, &block, &oldBlock);
    assert(n == 0);
    //循环打印当前进程的pending位图
    while(true){
        sleep(1);
        sigset_t set;
        sigpending(&set);//获取pending位图
        //循环判断1 - 31位是0还是1并打印
        for(int i = 1; i <= 32; i++){
            if(sigismember(&set, i)) cout << "1";
            else cout << "0";
        }
        cout << endl;
    }

    return 0;
}

Software is like sex: it's better when it's free——Linus Torvalds


如有错误,敬请斧正

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

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

相关文章

Linux 中断子系统(二):GIC 中断控制器

GIC 是 ARM 公司给 Cortex-A/R 内核提供的一个中断控制器,类似 Cortex-M 内核(STM32)中的 NVIC。 GIC:Generic Interrupt Controller,通用中断控制器 NVIC:Nested Vectored. Interrupt Controller,嵌套向量中断控制器目前 GIC 有 4 个版本:V1 ~ V4,V1 是最老的版本,已…

react源码解析20.总结第一章的面试题解答

总结 至此我们介绍了react的理念&#xff0c;如果解决cpu和io的瓶颈&#xff0c;关键是实现异步可中断的更新 我们介绍了react源码架构&#xff08;uifn(state)&#xff09;&#xff0c;从scheduler开始调度&#xff08;根据过期事件判断优先级&#xff09;&#xff0c;经过r…

测试开发 | Jenkins job 机制该如何使用?

Jenkins 像老板一样管理各种 job 。job 是 Jenkins 的一个执行计划&#xff0c;是一系列操作的集合&#xff0c;Jenkins 里的最常用的功能就是 job 的构建&#xff0c;即任务的构建。通过构建 job 即可让工人为你工作。 image806387 84.3 KB 创建 job及配置步聚 可以通过如下步…

C#,图像二值化(20)——全局阈值的耶恩算法(Yen Thresholding)及源代码

1 全局阈值的耶恩算法&#xff08;Yen Throsholding&#xff09;常见阈值算法1.1黄算法HuangThresholdImageFilter使用Shannon的熵函数实现Huang的模糊阈值[1]。模糊性度量表示原始图像与其二进制版本之间的差异。对于给定的阈值级别&#xff0c;像素的模糊隶属度函数由像素灰度…

Java中常用API总结(7)—— BigDecimal类

BigDecimal类一、前言二、概述1.API帮助文档2.使用方法三、常见方法1.格式2.实例3.报错4.解决方法四、结语一、前言 在使用float或者double类型的数据在进行数学运算的时候&#xff0c;很有可能会产生 精度丢失问题 我们都知道计算机底层在进行运算的时候&#xff0c;使用的都…

Echarts image 使用

通过image://...xx.png 在扇形图中可能会失败&#xff0c;可以将需要载入的img转换成base64直接载入可以通过背景色来载入图片 backgroundColor: {image: xxx/xxx.jpg },实例&#xff08;扇形图&#xff09;&#xff1a;var option {tooltip: {trigger: "item",show…

如何用用C++实现通达信接口调用?有哪些技巧

c作为三大计算机语言之一&#xff0c;在编程时很受投资者的偏爱&#xff0c;特别是在通达信接口软件开发时C更是担任着重要的开发角色&#xff0c;今天小编就来和大家说一下如何用C实现通达信接口调用&#xff1f; 用C查询股份数据代码&#xff08;部分&#xff09; std::cou…

C4D和Maya哪个学起来更容易

Maxon Cinema 4D和 Autodesk Maya 是最著名的两种 3D 软件&#xff0c;艺术家和工作室经常在许多领域使用它们。它们都有不同的功能&#xff0c;在本文中&#xff0c;让我们对它们进行比较。我们将尝试向您概述它们之间的主要区别&#xff0c;以及这两者的功能。哪一个更容易使…

2: [SpringData集成Elasticsearch] --- 配置打印命令日志

文章目录一&#xff1a;引入SpringDataElasticsearch依赖二&#xff1a;创建RestHighLevelClient配置类三&#xff1a;配置YML&#xff1a; logging.level --- 日志等级三&#xff1a;请求接口&#xff0c;查看日志3.1&#xff1a;请求代码3.2&#xff1a;Postman请求地址3.3&a…

LayoutInflater学习(一)之布局解析

LayoutInflater的创建与实例化 LayoutInflater是位于 "android.view" 包下的一个抽象类,同样它也是一个系统级服务 package android.view; SystemService(Context.LAYOUT_INFLATER_SERVICE) public abstract class LayoutInflater { LayoutInflater是用来解析 xml…

桌面录屏软件,分享3个十分便捷的录屏软件

​图片和视频都是人们传播信息的方式&#xff0c;不过相比于图片&#xff0c;视频能够更加直观生动的表达信息。在日常生活中&#xff0c;除了屏幕上记录一些应用程序的内容外&#xff0c;有时我们还需要记录电脑桌面。有更好的桌面录屏软件吗&#xff1f;当然&#xff0c;小编…

Git操作不规范,战友提刀来相见!

年终奖都没了&#xff0c;还要扣我绩效&#xff0c;门都没有&#xff0c;哈哈。 这波骚Git操作我也是第一次用&#xff0c;担心闪了腰&#xff0c;所以不仅做了备份&#xff0c;也做了笔记&#xff0c;分享给大家。 文末留言抽奖&#xff0c;聊聊你的年终奖。 问题描述 小A和…

C++多线程(并发、进程、线程的基本概念和综述)

并发、进程、线程的基本概念和综述 并发 并发表示两个或者更多任务(独立的活动)同时发生(进行)。例如&#xff0c;一面唱歌一面弹琴&#xff0c;一面走路一面说话&#xff0c;画画的时候听小说等。回归到计算机领域&#xff0c;所谓并发&#xff0c;就是一个程序同时执行多个…

html 3D立体多形态旋转音乐相册 | 2022都结束了,还不快给女神制作一个特殊的纪念相册

&#x1f4cb; 前言 &#x1f5b1; 博客主页&#xff1a;在下马农的碎碎念✍ 本文由在下马农原创&#xff0c;首发于CSDN&#x1f4c6; 首发时间&#xff1a;2023/01/07&#x1f4c5; 最近更新时间&#xff1a;2023/01/07&#x1f935; 此马非凡马&#xff0c;房星本是星。向前…

零基础掌握IP地址知识,小白必学知识点!

前言 大家好&#xff0c;在生活中我们使用具有上网功能的电子设备都有IP地址&#xff0c;就跟每个人都有自己的名字一样。IP地址分为IPV4 IPV6&#xff0c;我们所说的的IP地址指的是IPV4的地址。 正文 IPV4( Internet Protocol Version 4 )互联协议版本4&#xff0c;有版本V4之…

【HTML+CSS+JavaScript】动感爱心—— I love you~

有段时间没有分享了,no time。 还是抽出一会儿分享一下。有时间会解析的(具体…I don’t know)。 1. 效果展示 真实效果挺好看的,喜欢的朋友,可以给你的女朋友或者喜欢的TA看看呀! 可以根据实际情况修改文案,比如诗歌,或者你爱的人的名字哦~ 2. 源代码分享 2.1 动感…

在Ubuntu上安装docker(Ubuntu版本18.04)

在Ubuntu上安装docker详细步骤1、卸载之前的docker版本2、安装docker仓库3、在系统中添加Docker的官方密钥4、添加docker源5、再次更新源列表6、查看可以安装的docker版本并安装docker7、使用命令查看是否安装成功以及安装的docker版本8、启动 docker服务并设置开机自动启动doc…

FPGA基础之modelsim常见问题

目录 问题一&#xff1a;modelsim破解失败 1&#xff09;现象 2&#xff09;原因 ​ 3&#xff09; 解决 问题一&#xff1a;modelsim破解失败 1&#xff09;现象 modelsim激活失败&#xff0c;原先正常使用过的&#xff0c;重新卸载安装破解&#xff0c;设置环境变量…

Serverless 奇点已来,下一个十年将驶向何方?

本文整理自 QCon 上海站 2022 丁宇&#xff08;叔同&#xff09;的演讲内容。 以前构建应用&#xff0c;需要买 ECS 实例&#xff0c;搭建开源软件体系然后维护它&#xff0c;流量大了扩容&#xff0c;流量小了缩容&#xff0c;整个过程非常复杂繁琐。 用了 Serverless 服务以…

【如何添加本地jar包到maven依赖】

如何添加本地jar包到maven依赖 1、本地jar包和对应依赖如下图&#xff08;刚开始这俩依赖是报红的&#xff09; 2、执行mvn命令如下&#xff1a; mvn install:install-file -DfileD:\ht_mesis-platform\mesis-business\dandian4-1.0.0.jar -Dpackagingjar -DgroupIddandian4…