Linux信号补充——信号发送和保存
三、信号的发送与保存
3.1信号的发送
必须有操作系统来保存信号,因为他是管理者;
信号给进程的task_struct发送信号,在task_struct中维护了一个整数signal有0-31位,共32个bit位;对于信号的管理使用的是位图结构,即0/1表示未收到/收到,对于31种信号就是对应位置为1,其余位置为0,0位置一般是0,全0表示没有收到信号;
即1.信号的编号表示对应的位置置为一;2.所谓的发信号就是修改位图结构对应位置的bit位;
操作系统是进程的管理者,只有他可以修改进程的属性,即将进程内部的信号进行修改;
对于信号处理的结果终止、核心转储、忽略、暂停、继续,操作系统提供温和的方式,并不会直接粗暴地只是终止进程一个选择(具备直接杀死进程的能力),是因为要满足外界的需求,防止直接终止程序,而不进行更重要的收尾工作,最终由操作系统来担责任;
3.2信号的保存
3.2.1对于普通信号和实时信号的处理
对于普通信号是不会立即处理的(可能进行着比处理信号更重要的事情),所以在产生信号到处理信号的时间窗口期间要保存信号;使用位图保存信号就是为了解决判断在不在和是几的问题,而位图结构这种值与位置映射的哈希关系简单并且正好符合需求;同时发送多个相同信号但是操作系统会将其当作一个信号处理(即发送了10个,会有9次丢失),因为每种信号只有一个位置来进行表示;
而对于实时信号,1.必须立即处理;2.信号不能丢失,来10次必须处理10次;所以不可以用位图这种结构来保存,需要使用双链表和队列来实现;
3.2.2信号在进程中的内核设计
1.信号处理的动作叫做信号递达(Delivery),即信号处理(包括默认、忽略、自定义处理)使用的是(Handler表,是一个函数指针数组表);2.信号从产生到递达的状态叫做信号未决,即信号保存使用的是(Pending表,是一个位图),信号未决状态是和位图相关的;3.进程可以选择阻塞某个信号,一旦信号被阻塞,那么这个信号就不会被递达(可以接收保存),为了实现阻塞,操作系统设计了block表,是一个位图结构,0/1表示非阻塞/阻塞;
普通信号从1-31都有自己对应的信号处理方式,即每一个信号对应Handler表的下标存放着信号处理方法的指针,一般存放的是系统的默认实现,当使用signal(signo,handler)函数时,就会将函数指针替换成自定义或者是忽略行为;
信号产生,通过信号编号来找Handler表的下标位置调用信号处理方法和产生硬件中断,根据中断号调用中断向量表的硬件处理方法是类似的;
总结:操作系统为进程识别和处理信号,在内核结构里设置了两张位图结构(用数组维护的位图结构,默认为0,可以支持扩展性,这种结构会被封装,提供给上层使用,类似共享内存的属性,套接字属性)和一张函数指针数组,在task_struct结构中存放着这三张表;信号是通过使用三张表来实现对信号的管理。对于一个信号编号,三张表都使用同一对应下标。即对信号的操作都离不开这三张表;三张表的逻辑是独立的;

3.2.1系统接口来管理三张表
//handler表
typedef void (*__sighandler_t) (int);
#define SIG_DFL ((__sighandler_t) 0) /* Default action. */
#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */
//将0、1强转成函数指针类型
sigset_t//信号集类型,输出型参数类型,用来获取内核两张位图表;
//sigset_t类型对于每种信号用一个bit表示“有效”或“无效”状态,至于这个类型内部如何存储这些bit则依赖于系统实现,从使用者的角度是不必关心的,使用者只能调用以下函数来操作sigset_ t变量,而不应该对它的内部数据做任何解释,即面向对象封装;
#include <signal.h>
int sigemptyset(sigset_t *set);//将位图清空
int sigfillset(sigset_t *set);//设置位图全部为1
int sigaddset (sigset_t *set, int signo);//设置位图的特定位置为1
int sigdelset(sigset_t *set, int signo);//设置位图的特定位置为0
int sigismember(const sigset_t *set, int signo);//判断是否存在于位图结构
//调用函数sigprocmask可以读取或更改进程的信号屏蔽字(阻塞信号集)。
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
返回值:若成功则为0,若出错则为-1
//第一个参数如下三选一:
SIG_BLOCK(相当于原位图|set)、SIG_UNBLOCK(相当于原位图&~set)、SIG_SETMASK(相当于原位图=set)
//第二个参数是输入型参数,用来修改位图;
//第三个参数用来获取修改前的结果,保存老的位图结构,用来恢复;
//操作系统不允许某些信号的屏蔽;比如 9、19
#include <signal.h>
int sigpending(sigset_t *set);
//外界获取pending位图表
总结:1.对于block表的修改使用sigset_t类型+sigprocmask()函数来进行修改;2.对于pending表的修改使用sigset_t类型+sigpending()函数来进行修改;3.对于handler表使用signal()函数进行修改;
四、信号的捕捉处理
信号保存后会在合适的时间进行处理;
4.1信号处理时间
进程会在操作系统的调度下处理信号,操作系统只管发信号,即信号处理是由进程完成的;
1.信号处理首先进程得检查是否有信号;2.进程要处于内核状态才能处理信号;
即进程会在内核态返回用户态的时候检查并处理信号;

相关文章:
Linux信号补充——信号发送和保存
三、信号的发送与保存 3.1信号的发送 必须有操作系统来保存信号,因为他是管理者; 信号给进程的task_struct发送信号,在task_struct中维护了一个整数signal有0-31位,共32个bit位;对于信号的管理使用的是位图结…...
Vue3 中应该使用 Ref 还是 Reactive?
一、引言 在Vue 3中,构建响应式数据结构是构建用户界面和交互体验的核心部分。而在创建这些响应式数据时,我们有两个主要工具:reactive和ref。选择使用哪一个,实际上取决于你的数据结构和访问需求。 reactive主要用于处理复杂的数…...
红外相机和RGB相机标定:实现两种模态数据融合
1. 前期准备 RGB相机:森云智能SG2-IMX390,1个红外相机:艾睿光电IR-Pilot 640X-32G,1个红外标定板:https://item.taobao.com/item.htm?_ujp3fdd12b99&id644506141871&spma1z09.2.0.0.5f822e8dKrxxYI 2.操作步…...
前端项目,个人笔记(五)【图片懒加载 + 路由配置 + 面包屑 + 路由行为修改】
目录 1、图片懒加载 步骤一:自定义全局指令 步骤二:代码中使用 编辑步骤三:效果查看 步骤四:代码优化 2、封装组件案例-传对象 3、路由配置——tab标签 4、根据tab标签添加面包屑 4.1、实现 4.2、bug:需要…...
【MySQL】2.MySQL数据库的基本操作
目录 数据库基本操作 查看数据库信息 查看数据库结构 显示数据表的结构(字段) 常用的数据类型 数据库管理操作 SQL语句概述 SQL分类 1.DDL:数据定义语言 1.1创建数据库和表 创建数据库 创建数据表 1.2删除数据库和表 删除数据表…...
常见技术难点及方案
1. 分布式锁 1.1 难点 1.1.1 锁延期 同一时间内不允许多个客户端同时获得锁; 1.1.2 防止死锁 需要确保在任何故障场景下,都不会出现死锁; 1.2.3 可重入 特殊的锁机制,它允许同一个线程多次获取同一个锁而不会被阻塞。 1.2…...
c#关键字 static
static 修饰符可用于声明 static 类。 在类、接口和结构中,可以将 static 修饰符添加到字段、方法、属性、运算符、事件和构造函数。 static 修饰符不能用于索引器或终结器 尽管类的实例包含该类的所有实例字段的单独副本,但每个 static 字段只有一个副…...
redis 如何保证数据同步(数据变化时)
redis 如何保证数据同步(数据变化时) 思路 1.新增、删除和修改都先对数据库进行操作,这时数据库的数据将域缓存中数据不同。 2.数据库进行变动后,返回结果,根据返回的结果判断数据库操作是否成功。 3.如果数据库操…...
Ubuntu18.04桌面版设置静态IP地址
引用: Ubuntu配置静态IP_ubuntu配置静态ip地址-CSDN博客 正文 默认Unbuntu 18.04 Desktop桌面版使用 netplan 管理网卡网络地址。使用Unbuntu 18.04 桌面版配置,可以通过桌面上的设置图标配置网卡的静态IP地址。 点击桌面右上角下拉框,点击“设置”按…...
Aztec的客户端证明
1. 引言 隐私保护 zk-rollup 的证明生成与通用 zk-rollup 的证明生成有很大不同。原因是给定交易中存在特定数据(由私有函数处理),我们希望保持完全私有。在本文中,我们探讨了用于证明私有函数正确执行的客户端证明生成ÿ…...
面试官:小伙子知道synchronized的优化过程吗?我:嘚吧嘚吧嘚,面试官:出去!
写在开头 面试官:小伙子,多线程中锁用过吗? 我:那是自然! 面试官:那你知道synchronized的优化吗? 我:synchronized作为重锁,开销大,在早期不被推荐使用&…...
100天精通风控建模(原理+Python实现)——第23天:风控建模中的贝叶斯优化是什么?怎么实现?
在当今风险多变的环境下,风控建模已经成为金融机构、企业等组织的核心工作之一。在各大银行和公司都实际运用于业务,用于营销和风险控制等。本文以视频的形式阐述风控建模中的召回率是什么,怎么实现。并提供风控建模原理和Python实现文章清单。 之前已经阐述了100天精通…...
Http 超文本传输协议基本概念学习摘录
目录 HTTP协议 超文本传输协议 HyperText超文本 HTML超文本标记语言 HTTP协议原理 请求发送 服务器处理 响应发送 连接关闭或保持 HTTP协议版本 HTTP/0.9 HTTP/1.0 HTTP/1.1 HTTP/2 HTTP/3 HTTP请求方法 GET POST PUT DELETE HEAD OPTIONS HTTP请求头字…...
模拟-算法
文章目录 替换所有的问号提莫攻击Z字形变换外观数列数青蛙 替换所有的问号 算法思路: 从前往后遍历整个字符串,找到问号之后,就遍历 a ~ z 去尝试替换即可。 class Solution {public String modifyString(String s) {char[] ss s.toCharA…...
深入了解鸿鹄工程项目管理系统源码:功能清单与项目模块的深度解析
工程项目管理软件是现代项目管理中不可或缺的工具,它能够帮助项目团队更高效地组织和协调工作。本文将介绍一款功能强大的工程项目管理软件,该软件采用先进的Vue、Uniapp、Layui等技术框架,涵盖了项目策划决策、规划设计、施工建设到竣工交付…...
Unbuntu20.04 git push和pull相关问题
文章目录 Unbuntu20.04 git push和pull使用1.下载[Git工具包](https://git-scm.com/downloads)2.建立本地仓库3.将本地仓库与github远程仓库关联4.将本地仓库文件上传到github远程仓…...
hive SQL 移位、运算符、REGEXP正则等常用函数
orderflag & shiftleft(1,14) shiftleft(1,14) SQL中使用的运算符号详解_sql中各种符号-CSDN博客 Hive函数_hive shift-CSDN博客 (内建函数(类型排序)_云原生大数据计算服务 MaxCompute(MaxCompute)-阿里云帮助中心)...
33-Java服务定位器模式 (Service Locator Pattern)
Java服务定位器模式 实现范例 服务定位器模式(Service Locator Pattern)用于想使用 JNDI 查询定位各种服务的时候考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术在首次请求某个服务时,服务定位器在 JNDI…...
前端小卡片:vue3路由是什么,有什么作用,该如何配置?
在 Vue 3 中,路由的处理使用了 Vue Router,它是官方提供的路由管理器。Vue Router 用于实现单页应用中的路由功能,通过将不同的 URL 映射到对应的组件,实现页面之间的切换和导航。 Vue Router 的作用包括: 实现页面之…...
Jackson 2.x 系列【2】生成器 JsonGenerator
有道无术,术尚可求,有术无道,止于术。 本系列Jackson 版本 2.17.0 源码地址:https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 前言2. 案例演示2.1 创建 JsonFactory2.2 创建 JsonGenerator2.3 写入操作2.4 查…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
