当前位置: 首页 > news >正文

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信号的发送 ​ 必须有操作系统来保存信号&#xff0c;因为他是管理者&#xff1b; ​ 信号给进程的task_struct发送信号&#xff0c;在task_struct中维护了一个整数signal有0-31位&#xff0c;共32个bit位&#xff1b;对于信号的管理使用的是位图结…...

Vue3 中应该使用 Ref 还是 Reactive?

一、引言 在Vue 3中&#xff0c;构建响应式数据结构是构建用户界面和交互体验的核心部分。而在创建这些响应式数据时&#xff0c;我们有两个主要工具&#xff1a;reactive和ref。选择使用哪一个&#xff0c;实际上取决于你的数据结构和访问需求。 reactive主要用于处理复杂的数…...

红外相机和RGB相机标定:实现两种模态数据融合

1. 前期准备 RGB相机&#xff1a;森云智能SG2-IMX390&#xff0c;1个红外相机&#xff1a;艾睿光电IR-Pilot 640X-32G&#xff0c;1个红外标定板&#xff1a;https://item.taobao.com/item.htm?_ujp3fdd12b99&id644506141871&spma1z09.2.0.0.5f822e8dKrxxYI 2.操作步…...

前端项目,个人笔记(五)【图片懒加载 + 路由配置 + 面包屑 + 路由行为修改】

目录 1、图片懒加载 步骤一&#xff1a;自定义全局指令 步骤二&#xff1a;代码中使用 ​编辑步骤三&#xff1a;效果查看 步骤四&#xff1a;代码优化 2、封装组件案例-传对象 3、路由配置——tab标签 4、根据tab标签添加面包屑 4.1、实现 4.2、bug&#xff1a;需要…...

【MySQL】2.MySQL数据库的基本操作

目录 数据库基本操作 查看数据库信息 查看数据库结构 显示数据表的结构&#xff08;字段&#xff09; 常用的数据类型 数据库管理操作 SQL语句概述 SQL分类 1.DDL&#xff1a;数据定义语言 1.1创建数据库和表 创建数据库 创建数据表 1.2删除数据库和表 删除数据表…...

常见技术难点及方案

1. 分布式锁 1.1 难点 1.1.1 锁延期 同一时间内不允许多个客户端同时获得锁&#xff1b; 1.1.2 防止死锁 需要确保在任何故障场景下&#xff0c;都不会出现死锁&#xff1b; 1.2.3 可重入 特殊的锁机制&#xff0c;它允许同一个线程多次获取同一个锁而不会被阻塞。 1.2…...

c#关键字 static

static 修饰符可用于声明 static 类。 在类、接口和结构中&#xff0c;可以将 static 修饰符添加到字段、方法、属性、运算符、事件和构造函数。 static 修饰符不能用于索引器或终结器 尽管类的实例包含该类的所有实例字段的单独副本&#xff0c;但每个 static 字段只有一个副…...

redis 如何保证数据同步(数据变化时)

redis 如何保证数据同步&#xff08;数据变化时&#xff09; 思路 1.新增、删除和修改都先对数据库进行操作&#xff0c;这时数据库的数据将域缓存中数据不同。 2.数据库进行变动后&#xff0c;返回结果&#xff0c;根据返回的结果判断数据库操作是否成功。 3.如果数据库操…...

Ubuntu18.04桌面版设置静态IP地址

引用: Ubuntu配置静态IP_ubuntu配置静态ip地址-CSDN博客 正文 默认Unbuntu 18.04 Desktop桌面版使用 netplan 管理网卡网络地址。使用Unbuntu 18.04 桌面版配置&#xff0c;可以通过桌面上的设置图标配置网卡的静态IP地址。 点击桌面右上角下拉框&#xff0c;点击“设置”按…...

Aztec的客户端证明

1. 引言 隐私保护 zk-rollup 的证明生成与通用 zk-rollup 的证明生成有很大不同。原因是给定交易中存在特定数据&#xff08;由私有函数处理&#xff09;&#xff0c;我们希望保持完全私有。在本文中&#xff0c;我们探讨了用于证明私有函数正确执行的客户端证明生成&#xff…...

面试官:小伙子知道synchronized的优化过程吗?我:嘚吧嘚吧嘚,面试官:出去!

写在开头 面试官&#xff1a;小伙子&#xff0c;多线程中锁用过吗&#xff1f; 我&#xff1a;那是自然&#xff01; 面试官&#xff1a;那你知道synchronized的优化吗&#xff1f; 我&#xff1a;synchronized作为重锁&#xff0c;开销大&#xff0c;在早期不被推荐使用&…...

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字形变换外观数列数青蛙 替换所有的问号 算法思路&#xff1a; 从前往后遍历整个字符串&#xff0c;找到问号之后&#xff0c;就遍历 a ~ z 去尝试替换即可。 class Solution {public String modifyString(String s) {char[] ss s.toCharA…...

深入了解鸿鹄工程项目管理系统源码:功能清单与项目模块的深度解析

工程项目管理软件是现代项目管理中不可或缺的工具&#xff0c;它能够帮助项目团队更高效地组织和协调工作。本文将介绍一款功能强大的工程项目管理软件&#xff0c;该软件采用先进的Vue、Uniapp、Layui等技术框架&#xff0c;涵盖了项目策划决策、规划设计、施工建设到竣工交付…...

Unbuntu20.04 git push和pull相关问题

文章目录 Unbuntu20.04 git push和pull使用&#xff11;&#xff0e;下载[Git工具包](https://git-scm.com/downloads)&#xff12;&#xff0e;建立本地仓库&#xff13;&#xff0e;将本地仓库与github远程仓库关联&#xff14;&#xff0e;将本地仓库文件上传到github远程仓…...

hive SQL 移位、运算符、REGEXP正则等常用函数

orderflag & shiftleft(1,14) shiftleft(1,14) SQL中使用的运算符号详解_sql中各种符号-CSDN博客 Hive函数_hive shift-CSDN博客 &#xff08;内建函数&#xff08;类型排序&#xff09;_云原生大数据计算服务 MaxCompute(MaxCompute)-阿里云帮助中心&#xff09;...

33-Java服务定位器模式 (Service Locator Pattern)

Java服务定位器模式 实现范例 服务定位器模式&#xff08;Service Locator Pattern&#xff09;用于想使用 JNDI 查询定位各种服务的时候考虑到为某个服务查找 JNDI 的代价很高&#xff0c;服务定位器模式充分利用了缓存技术在首次请求某个服务时&#xff0c;服务定位器在 JNDI…...

前端小卡片:vue3路由是什么,有什么作用,该如何配置?

在 Vue 3 中&#xff0c;路由的处理使用了 Vue Router&#xff0c;它是官方提供的路由管理器。Vue Router 用于实现单页应用中的路由功能&#xff0c;通过将不同的 URL 映射到对应的组件&#xff0c;实现页面之间的切换和导航。 Vue Router 的作用包括&#xff1a; 实现页面之…...

Jackson 2.x 系列【2】生成器 JsonGenerator

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 前言2. 案例演示2.1 创建 JsonFactory2.2 创建 JsonGenerator2.3 写入操作2.4 查…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...