Linux操作系统~信号处理的底层原理

news2024/11/13 12:28:46

目录

1.信号在内核中的表示

信号处理的方法

2.信号的递达,未决,阻塞

3.信号集操作函数

(1).sigset_t(信号集类型)

 (2).信号集函数

(3).sigprocmask函数—修改block表

(4).测试

4.信号处理流程


1.信号在内核中的表示

        在进程的task_struct里面有三张表来存储信号相关的信息,分别是block表,pending表,handler表。block表和pending表是位图结构。

        block表用于表示当前信号是否被阻塞,比特位的位置代表信号的编号,比特位对应的值代表信号是否被阻塞,0表示未被阻塞,1表示被阻塞。

        pending表用于表示当前信号是否处于未决状态(就是是否有信号要处理),比特位的位置代表信号的编号,比特位对应的值代表信号是否收到该信号,0表示未收到,1表示收到。

         handler表用于保存进行信号递达(信号处理)时的处理方法,是一个指针数组,存放的是处理函数的指针。


信号处理的方法

信号处理有三种方式:

1.默认:如果要终止进程,直接终止进程,释放进程资源。如果要暂停进程,把进程状态设置为stop,放到等待队列里面就行。

2.忽略:将pending里面的1置为0,然后直接返回就行。

3.自定义捕捉:执行用户提供的信号处理函数handler。比如我们要处理信号4,此时我们处于内核态,根据4号信号的handler表里面找到用户定义的handler函数地址,然后切换到用户态执行信号处理函数(这里调用handler对操作系统来说相当于是一次回调)。


2.信号的递达,未决,阻塞

  • 实际执行信号的处理动作称为信号递达(Delivery)——自定义捕捉,默认,忽略(忽略就是把pending表/递达表从1置0)
  • 信号从产生到递达之间的状态,称为信号未决(Pending)——本质是这个信号被暂存在task_struct信号位图中,未决

        进程可以选择阻塞(Block )某个信号——本质是OS,允许进程暂时屏蔽指定的信号(之后再处理/递达)

被阻塞的信号:

1.该信号依旧是未决

2.该信号不会被递达,直到解除阻塞!方可递达

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

3.信号集操作函数

(1).sigset_t(信号集类型)

        未决和阻塞标志可以用相同的数据类型sigset_t来存储,sigset_t称为信号集,这个类型可以表示每个信号的“有效”或“无效”状态,在阻塞信号集中“有效”和“无效”的含义是该信号是否被阻塞,而在未决信号集中“有效”和“无效”的含义是该信号是否处于未决状态。

        就像是一个unsigned int

        虽然sigset_t 是一个位图结构,但是不同的OS实现是不一样的,不能让用户直接修改该变量,需要使用特定的函数

 (2).信号集函数

#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);  //判断当前信号是否在信号集中

  1. 函数sigemptyset初始化set所指向的信号集,使其中所有信号的对应bit清零,表示该信号集不包含 任何有效信号。
  2. 函数sigfillset初始化set所指向的信号集,使其中所有信号的对应bit置位,表示 该信号集的有效信号包括系统支持的所有信号。
  3. 注意,在使用sigset_ t类型的变量之前,一定要调用sigemptyset或sigfillset做初始化,使信号集处于确定的状态。初始化sigset_t变量之后就可以在调用sigaddset和sigdelset在该信号集中添加或删除某种有效信号。

(3).sigprocmask函数—修改block表

调用函数sigprocmask可以读取或更改进程的信号屏蔽字(阻塞信号集),也就是block位图

  • 第一个参数how可以用以下宏        
  • 第二个参数set是一个输入型参数,表示一个信号集(需要我们在用户层面使用信号集函数指定好信号集)
  • 第三个参数oset是一个输出型参数,把老的信号集返回出来

(4).测试

1.首先定义两个信号集,iset和oset,之后作为参数传到sigprocmask里面。

2.往iset里面加入2号信号

3.调用sigprocmask函数将2号信号设置为阻塞

4.结果:一直循环打印“zebra”,使用kill -2或者Ctrl+C没有反应。

#include <iostream>
#include <unistd.h>
#include <signal.h>
using namespace std;

int main()
{

    sigset_t iset, oset;
    sigemptyset(&iset);
    sigemptyset(&oset);

    sigaddset(&iset, 2); // 往iset里面加上2号信号
    sigprocmask(SIG_SETMASK, &iset, &oset);
    int count = 0;
    sigset_t pending;
    while (1)
    {
        printf("zebra\n");
    }
    return 0;
}

4.信号处理流程

 首先我们来了解一下什么是内核态,什么是用户态。

  • 内核态:执行OS的代码和数据时,计算机所处的状态就叫做内核态。OS的代码的执行全部都是在内核态
  • 用户态:就是用户代码和数据被访问或者执行的时候,所处的状态。我们自己写的代码全部都是在用户态执行的

    其主要区别在于权限不同,内核态的权限更高。

大致流程:

        我们在用户态发起系统调用(或者进程时间片到了,要切换进程,必须进入内核态,让操作系统来执行进程切换)后会进入内核态执行系统调用,执行完以后根据task_struct里面的pendng表,block表,和handler表(两个位图一个函数指针数组),检测是否有信号要处理,如果有一个信号block表里面是0,pending表里面是1,表示信号需要递达。此时我们根据handler表找到用户定义的自定义信号处理方法handler,切换到用户态执行handler方法(如果是默认或者忽略,则不需要进入用户态),然后再通过sigreturn函数返回内核态,进行后续一些处理以后(操作系统内核让你跳转到用户态,你执行完信号处理函数自然要返回给操作系统一些信息,比如是否执行成功等),检测有没有新的信号要递达,如果没有就返回用户态,继续执行进程后面的代码。

        

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

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

相关文章

基于asp.net194校园火车票预订系统-计算机毕业设计

项目介绍 asp.net版火车票查询系统主要有用户注册&#xff0c;在线查询&#xff0c;在线订票&#xff0c;后台管理等功能。用户只有先注册才能登录火车票查询系统的首界面&#xff0c;然后可以进行在线查询、车票订购的功能。可对车次信息的查询和客户对已定车票信息的查询&am…

【云原生进阶之容器】第一章Docker核心技术1.6节——UnionFS

1 UnionFS综述 1.1 什么是 UnionFS 联合文件系统(Union File System),2004年由纽约州立大学开发,它可以把多个目录内容联合挂载到同一个目录下,而目录的物理位置是分开的。UnionFS可以把只读和可读写文件系统合并在一起,具有写时复制功能,允许只读文件系统的修改可以保…

二叉排序树详解及实现

二叉排序树详解及实现1.什么是二叉排序树2.二叉排序树的数据结构2.1二叉排序树的节点类型2.2二叉排序树中插入某个元素2.3 二叉排序树中按值查找元素2.4 找排序二叉树中的最小值2.5返回排序二叉树中ptr中序遍历的后续节点2.6 寻找排序二叉树中的最大值2.7 寻找二叉树中中序遍历…

《痞子衡嵌入式半月刊》 第 68 期

痞子衡嵌入式半月刊: 第 68 期 这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :…

【分布式事务之spring实践】分布式事务选型实战

Spring中使用事务 Spring是一个伟大的框架&#xff0c;从一开始只是一个容器框架&#xff0c;到现在已经发展成为了一个包含企业开发中的方方面面的很多框架的总称。它不但从复杂度上&#xff0c;发展出了用于各个方面的子框架。它还从易用性出发&#xff0c;推出了像Spring-B…

多旅行商问题:世界杯优化算法(World Cup Optimization,WCO)求解多仓库多旅行商问题(提供Matlab代码)

一、世界杯优化算法 世界杯优化算法&#xff08;World Cup Optimization&#xff0c;WCO)由Navid Razmjooy等人于2016年提出&#xff0c;该算法模拟了国际足联世界杯比赛&#xff0c;思路新颖&#xff0c;收敛速度快&#xff0c;全局寻优能力强。 算法原理参考&#xff1a;智…

[附源码]Node.js计算机毕业设计河南美丽乡村旅游信息网Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

[附源码]Nodejs计算机毕业设计基于远程协作的汽车故障诊断系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

DevOps实战系列【第十四章-完结篇】:Jenkins Pipeline最佳实践案例

个人亲自录制全套DevOps系列实战教程 &#xff1a;手把手教你玩转DevOps全栈技术 我们将之前的案例&#xff0c;使用流水线构建一下 搭建一个Jenkinsfile模型 pipeline {agent anystages {stage(拉取gitlab项目代码) {steps {echo "拉取git代码"}}stage(构建代码) {…

FRP进阶篇之解决方案

目录 一、前言 二、多客户端使用 1、场景 2、解决方案 3、使用 3.1、服务端配置 3.2、客户端配置 3.3、结果验证 三、dashboard 仪表盘使用 1、场景 2、解决方案 3、使用 4、验证 5、使用Java调用API接口获取设备列表 5.1、样例代码 5.2、结果验证 一、前言 通…

27. SAP OData 框架里的缓存(Cache)设计专题讲座

本教程前一篇文章,25. 答疑 - SAP OData 框架处理 Metadata 元数据请求的实现细节,前后端组件部署在同一台物理服务器,我们介绍了 SAP OData 框架处理 metadata 请求的流程,如下图所示: 其中左边的分支,当读取本地服务器的 metadata 时,OData 框架会从 Share Memory 即共…

npm-开发自己的包并发布

目录 1.开发自己的包 1.1. 需要实现的功能 1.2. 初始化包的基本结构 1.3. 初始化 package.json 1.4. 在 index.js 中定义格式化时间的方法 1.5. 在 定义转义 和还原HTML 的方法 1.6. 编写包的说明文档 1.7包的入口文件 2.发布自己的包 2.1注册npm账号 2.2登录npm账…

Jmeter(二十):jmeter对图片验证码的处理

jmeter对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入&#xff0c;而且每次登录时图片验证码都是随机的&#xff1b;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段&#xff0c;然后再登录接口中使用&#xff1b; 通过jmeter对图片验证码…

Qt下载安装及配置教程

进入qt中文网站&#xff1a;https://www.qt.io/zh-cn/ 下载开源版 往下滑&#xff0c;下载Qt在线安装程序 它已经检测出我的是windows系统&#xff0c;直接点击download就好。如果是其它的系统&#xff0c;需要找到对应自己系统的安装包。 然后跟网速有关&#xff0c;等…

计算机毕业设计springboot+vue大学生个人财务管理系统

项目介绍 本大学生个人财务管理系统设计目标是实现收入和支出的信息化管理,提高管理效率,使得支出收入管理工作规范化、科学化、高效化。 本文研究的大学生个人财务管理系统基于springboot架构,采用JSP技术、JAVA编程语言和MYSQL数据库设计开发。通过本系统,实现了管理员和用户…

设计模式之享元模式

Flyweight design pattern 享元模式的概念、享元模式的结构、享元模式的优缺点、享元模式的使用场景、享元模式的实现示例、享元模式的源码分析 1、享元模式的概念 享元模式&#xff0c;即运用共享技术来有效的支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少…

基于nodejs博客系统的设计与实现.rar(论文+源码+ppt文档+视频录制)

第一章绪论 3 1.1项目开发的背景和意义 3 1.2国内外研究的现状 4 1.3研究的主要内容 4 第2章系统相关技术介绍 5 2.1 B/S结构技术介绍 5 2.2nodejs技术介绍 6 2.3mysql数据库 7 第三章系统分析 8 3.1可行性分析 8 3.2功能需求分析 8 3.2.1登录模块需求分析 9 3.2.2分类博客模块…

NetSuite 如何统一用户的时区

在NetSuie的原始设置中&#xff0c;用户可以设置自己的时区&#xff0c;这在单一国家的环境中实际上是个缺点。例如&#xff0c;有些客户并没有注意到自己的时区是否是本国时区&#xff0c;所以在查看系统日志时&#xff0c;发现时间不对头&#xff0c;产生了困扰。所以&#x…

操作系统,计算机网络,数据库刷题笔记13

操作系统&#xff0c;计算机网络&#xff0c;数据库刷题笔记13 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xf…

SpringBoot3.0自定义stater整合chatGPT49种应用场景代码已开源

导读 导读 | 12月总体来说互联网的技术圈是非常热闹的&#xff0c;chatGPT爆火&#xff0c;SpringBoot3.0发布等重磅陆消息续进入大家的视线&#xff0c;而本文作者将以技术整合的角度&#xff0c;带大家把最火的两个技术整合在一起。读完本文&#xff0c;你将熟悉SpringBoot3…