Linux信号_信号的保存

news2024/11/7 14:26:40

我们知道向进程发送信号,进程并不是立即处理,而是等合适的时机进行处理。那么就需要保存信号。在信号的产生中说过信号保存在进程PCB里面的信号位图里,那信号位图到底是什么?

一.信号保存

我们先补充一些概念

1.阻塞 忽略概念

实际执行信号的处理动作称为信号递达(Delivery)
信号从产生到递达之间的状态,称为信号未决(Pending)。(只把信号保存,但还没有进行处理)
进程可以选择阻塞 (Block )某个信号。
被阻塞的信号产生时将保持在未决状态(保存信号,但不让处理),直到进程解除对此信号的阻塞,才执行递达的动作.
注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略(处理信号,但行为就是忽略)是在递达之后可选的一种处理动作。

2.block pending信号集 handler信号处理器表

我们之前说的信号位图就是下面三个表中的pending表,那这三个表有什么用呢?

1.pending位图,当前进程收到的信号列表。bit位的位置表示信号编号,1/0表示是否收到信号。

2.block位图,表示哪些信号正在被阻塞。bit位的位置表示信号编号,1/0表示该信号是否被阻塞(如果被阻塞,在pending表中对应信号即使为1,也不会对信号进行处理,等到阻塞消失,才会完成消息递达)。

3.handler信号处理表(函数指针数组),表示对应信号要进行的行为(可以是系统默认的,也可以是signal()函数自定义行为)。信号编号-1就是要执行动作函数指针的下标

sigset_t 信号集

我们知道block pending表是位图,但他们的类型是什么?是int吗?

其实它们的类型是一个结构体sigset_t

#include <signal.h>

typedef struct {
    unsigned long __val[2];  // 通常是一个长度为 2 的 unsigned long 数组
} sigset_t;

未决和阻塞标志可以用相同的数据类型sigset_t来存储,sigset_t称为信号集,这个类型可以表示每个信号的“有效”或“无效”状态.

阻塞信号集(block)也叫做当前进程的信号屏蔽字(Signal Mask),这里的“屏蔽”应该理解为阻塞而不是忽略。

3.信号集操作函数

我们知道block pending表是位图,但不建议直接用位操作来更改bit位。而是用信号集操作函数来实现。

增删查改

#include <signal.h>
int sigemptyset(sigset_t *set); //将set位图bit位全置为0
int sigfillset(sigset_t *set);  //将set位图bit位全置为1
int sigaddset (sigset_t *set, int signo); //向信号集中添加一个信号,下标signo-1置1
int sigdelset(sigset_t *set, int signo);  //从信号集中删除一个信号,下标signo-1置0
//这四个函数都是成功返回0,出错返回-1。
int sigismember(const sigset_t *set, int signo); //查找signo信号是否属于给定的信号集。
//如果信号在集合中,返回 1;如果不在集合中,返回 0;如果出错,返回 -1。

sigprocmask 更改block

调用函数sigprocmask可以读取或更改进程的信号屏蔽字(阻塞信号集)。

#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
返回值:若成功则为0,若出错则为-1

1.int how 如何更改

2.set 指向需要操作的信号集。

3.oset 用于存储原来的信号屏蔽字(可选)。

成功时返回 0,失败时返回 -1。

eg.

sigset_t set, oldset;
sigemptyset(&set);//初始化信号集 bit位全置0
sigaddset(&set, SIGINT);

// 在内核PCB中block中 阻塞 SIGINT 信号
sigprocmask(SIG_BLOCK, &set, &oldset);

// 恢复屏蔽字
sigprocmask(SIG_SETMASK, &oldset, NULL);

sigpending 读取未决信号集(pending)

#include <signal.h>

int sigpending(sigset_t *set);

set: 指向 sigset_t 类型的变量,用于存储当前进程的未决信号集。调用成功后,该变量将包含当前进程未决信号的集合。

如果调用成功,返回 0。出错,返回 -1,并将 errno 设置为具体的错误值。

补充:操作系统是如何运行的

1.硬件中断

当我们用键盘输入信息,操作系统怎么知道键盘要输入信息的?又是怎么知道其它外设有资源要处理呢?

1.中断触发。当外设准备好时,就会发起中断每一个外设都对应一个中断号。(eg.键盘输入时会触发中断号1)

2.保存上下文。收到中断请求时,CPU会保护现场,暂停当前的程序执行,保存当前的执行状态(即程序计数器、寄存器等)。

3.查找中断向量。根据中断号,操作系统查找中断向量表,获取对应的中断处理程序地址,并执行对应方法。

4.恢复现场:中断处理完成后,恢复先前的执行状态(程序计数器、寄存器等),并继续执行被中断的程序。

2.时钟中断

现在我们知道了每当外设有资源要处理时,会通过中断的方式让CPU进行处理。但这和操作系统运行有什么关系呢?

其实有一个硬件时钟源,它会每隔很短的时间向操作系统发送中断,所以操作系统就会根据它的中断号来查找中断向量表,执行它对应的方法。但时钟源对应的中断服务就是进程调度这样操作系统,就可以在硬件时钟的推动下,自动调度了。

因为时钟源会频繁向系统发送中断,这样会占用大量中断控制器资源,降低响应速度。所以一般把时钟源集成到CPU内部减少中断传播延迟。

时钟源发送中断,引起的中断服务:进程调度 并不意味着要进行进程切换。

比如说执行一个进程的时间片1s int count=1000,时钟源每隔1微秒中断一次,count--。当count==0时就意味着时间片耗尽,要切换下一个进程。

3.软件中断

上面都是因为硬件触发的中断,有没有因为软件来触发中断的?

eg.1.系统调用 为了让操作系统支持系统调用,CPU也设计了对应的汇编指令(int 或者 syscall),让CPU在内部触发中断逻辑。

2.缺页中断 /0 野指针操作

1.系统调用

int 0x80 是一种在 x86 架构(尤其是 32 位系统)中触发软件中断的指令,常用于执行 系统调用(system call)。

int 触发一个中断,后面加中断号

0x80 作为中断号,在 32 位 x86 系统中约定为触发 系统调用的入口。

1.int 0x80,触发软件中断。系统根据后面0x80中断号,在中断向量表中找到对应的处理程序。

2.再根据系统调用号作为下标查找系统调用表中的对应函数指针。

3.返回函数执行结果。

系统调用号哪来的?寄存器EAX中

在系统调用的过程中,把要调用的系统调用号写入寄存器EAX中

(系统调用参数一般也是通过寄存器传的  返回值通常存放在寄存器中,如 EAX(32位架构)或 RAX(64位架构))

所以系统调用也是通过中断完成的

由此看来,Linux内核提供的系统调用接口,不是C语言,而是系统调用号+传递参数 返回值寄存器 +int 0x80 / syscall实现的。

我们平常用的都是C语言封装的调用

2.缺页中断 /0 野指针操作

除了系统调用会触发软中断,像缺页中断 /0 野指针等异常操作也会触发软中断。

为什么说/0 访问野指针,系统能知道。就是因为触发了软中断,让操作系统找中断向量表,找到对应的执行程序。

1.CPU内部触发的软中断,int 0x80 syscall ,我们叫做陷阱。

2./0 野指针等 我们叫做异常

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

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

相关文章

如何使用示波器测量信号强度

示波器是一种用于观察和分析电信号的电子测试仪器。它可以显示信号的波形、幅度、频率和其他特性&#xff0c;是工程师和技术人员进行电路设计、调试和故障排除的重要工具。本文将详细介绍如何使用示波器测量信号强度。 一、认识示波器的基本组成部分 显示屏&#xff1a;用于显…

Axure设计之三级联动选择器教程(中继器)

使用Axure设计三级联动选择器&#xff08;如省市区选择器&#xff09;时&#xff0c;可以利用中继器的数据存储和动态交互功能来实现。下面介绍中继器三级联动选择器设计的教程&#xff1a; 一、效果展示&#xff1a; 1、在三级联动选择器中&#xff0c;首先选择省份&#xff…

K8S篇(基本介绍)

目录 一、什么是Kubernetes&#xff1f; 二、Kubernetes管理员认证&#xff08;CKA&#xff09; 1. 简介 2. 考试难易程度 3. 考试时长 4. 多少分及格 5. 考试费用 三、Kubernetes整体架构 Master Nodes 四、Kubernetes架构及和核心组件 五、Kubernetes各个组件及功…

卖模版还能赚到钱吗?

说到赚钱&#xff0c;我想大部分人都会感兴趣。但如果告诉大家现阶段卖模板也能赚钱&#xff0c;可能还是有人不信。我要说说我的观察了。 本文可在公众号「德育处主任」免费阅读 我是一只临期程序猿&#xff0c;我最早接触到“模板能卖钱”这个概念是在模板王里。模板王平台上…

超萌!HTMLCSS:打造趣味动画卡通 dog

这段HTML与CSS代码实现了一个超萌的动画卡通dog。 HTML <div class"dog"><div class"dog-body"><div class"dog-tail"><div class"dog-tail"><div class"dog-tail"><div class"do…

Elasticsearch Interval 查询:为什么它们是真正的位置查询,以及如何从 Span 转换

作者&#xff1a;来自 Elastic Mayya Sharipova 解释 span 查询如何成为真正的位置查询以及如何从 span 查询过渡到它们。 长期以来&#xff0c;Span 查询一直是有序和邻近搜索的工具。这些查询对于特定领域&#xff08;例如法律或专利搜索&#xff09;尤其有用。但相对较新的 …

【YOLOv11[基础]】实例分割Seg | 导出ONNX模型 | ONN模型推理以及检测结果可视化 | python

本文将导出YOLO-Seg.pt模型对应的ONNX模型,并且使用ONNX模型推理以及结果的可视化。话不多说,先看看效果图吧!!! 目录 一 导出ONNX模型 二 推理及检测结果可视化 1 代码 2 效果图

手搓AI大模型应用获25万用户,果断辞职创业,结果收入不如摆摊

我开发的 AI 应用有 25 万用户&#xff0c;我感觉要起飞了&#xff0c;于是辞掉工作&#xff0c;准备大干一番。 结果没想到开局即巅峰&#xff0c;突然就完蛋了。 这几天&#xff0c;一个悲催的程序员创业故事在社交网络上流传&#xff0c;引发了人们的深思。 故事的主人公&…

品质生活新选择:看三星AI神黑钻衣物护理机,如何为用户打造精致日常

屠格涅夫曾说&#xff0c;一个人应当好好地安排生活&#xff0c;要使每一刻的时光都有意义。这不仅是对个人生活的深刻洞察&#xff0c;也是对生活品质的不懈追求。实际上&#xff0c;在追求品质生活的道路上&#xff0c;无关乎年龄和阶层&#xff0c;其核心精髓往往潜藏于那些…

ios打包文件上传App Store windows工具

在苹果开发者中心上架IOS APP的时候&#xff0c;在苹果开发者中心不能直接上传打包文件&#xff0c;需要下载mac的xcode这些工具进行上传&#xff0c;但这些工具无法安装在windows或linux电脑上。 这里&#xff0c;我们可以不用xcode这些工具来上传&#xff0c;可以用国内的香…

Nginx(编译)+Lua脚本+Redis 实现自动封禁访问频率过高IP

1.安装lua 1.1安装LuaJIT yum install readline-devel mkdir -p lua-file cd lua-file/ wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz tar -zxvf LuaJIT-2.0.5.tar.gz cd LuaJIT-2.0.5 make && make install PREFIX/usr/local/luajit 1.2配置LuaJIT环境变量…

OA项目 python + vue3

准备工作 创建django项目 在setting.py进行数据库的配置&#xff1a; DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: , #数据库名字USER: , #连接的数据库的用户名PASSWORD: ,HOST: 127.0.0.1,PORT: 3306,} }安装app&#xff1a; rest_framwork: 关闭csrf…

内网渗透-信息收集篇

通过webshell或其他方式拿下一台机器&#xff0c;并且存在内网环境&#xff0c;这个时候就在准备进行内网渗透&#xff0c;而在内网渗透之前需要对本地机器进行信息收集&#xff0c;才能够更好的进行内网渗透。 目录 Windows本地基础信息收集 权限查看 判断域存在 查看防火…

斯坦福团队研发:手机运行的超GPT-4大模型一夜爆红,下载量突破2000次

在大模型落地应用的过程中&#xff0c;端侧 AI 是非常重要的一个方向。 近日&#xff0c;斯坦福大学研究人员推出的 Octopus v2 火了&#xff0c;受到了开发者社区的极大关注&#xff0c;模型一夜下载量超 2k。 20 亿参数的 Octopus v2 可以在智能手机、汽车、个人电脑等端侧…

【OpenAI】使用O1-Preview模型的3种方式,带你快速提升编程效率!

文章目录 一、模型概述1. GPT-3.5&#xff1a;坚实的基础2. GPT-4.0&#xff1a;突破性的升级3. GPT-4o&#xff1a;多模态处理的先锋4. GPT-4o MINI&#xff1a;轻量高效的AI解决方案5. O1-Preview&#xff1a;推理能力的极致提升 二、性能与应用场景对比性能与应用场景深入解…

一文轻松了解AUTOSAR系统开发步骤顺序

目录 往期推荐 AUTOSAR方法论的典型开发步骤顺序 1. 需求分析&#xff08;Requirement Analysis&#xff09; 2. 系统架构设计&#xff08;System Architecture Design&#xff09; 3. 软件组件设计与实现&#xff08;Software Component Design and Implementation&#…

计算机毕业设计Python+图神经网络手机推荐系统 手机价格预测 手机可视化 手机数据分析 手机爬虫 Django Flask Spark 知识图谱

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

python基础(1)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;初识python&#xff0c;环境配置&#xff0c;编程基础以及数据类型_哔哩哔哩_bilibili 一、什么是python Python 是一种高级、解释型、通用编程语…

【大数据学习 | HBASE】hbase的整体架构

hbase的region存储原理图 首先我们看到hbase的组成分为两个大的部分&#xff0c;分别是hmaster和hregionserver&#xff0c;主节点用于协调数据&#xff0c;regionserver用于真正的去管理表&#xff0c;其中regionserver存在多个&#xff0c;他们共同协调管理全有的表&#xff…

软信天成:您企业的数据资产真的安全吗?

您企业的数据资产真的安全吗&#xff1f;当下&#xff0c;数据已成为企业的核心资产&#xff0c;但如何找到、保护这些资产&#xff0c;却是许多企业面临的难题。在此背景下&#xff0c;数据分类分级显得尤为重要。本文将深入探讨数据分类分级&#xff0c;并结合国家标准和行业…