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.进程要处于内核状态才能处理信号;

​ 即进程会在内核态返回用户态的时候检查并处理信号;

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

线段树优化dp

abc339 E - Smooth Subsequence 思路&#xff1a;我们很容想到一个 n n n方的的状态转移方程&#xff0c;即对于每个i&#xff0c;我们去枚举 1 1 1到 i − 1 i-1 i−1的状态&#xff0c;即 d p [ i ] m a x ( d p [ i ] , d p [ j ] 1 ) ; dp[i]max(dp[i],dp[j]1); dp[i]ma…

Vue字符串里的中文数字转换为阿拉伯数字

js字符串里的中文数字转换为数字 <template><view><view><view class"inpbox" ><textarea v-model"voiceMane" input"convert" ></textarea></view></view></view> </template> &…

3.7 RK3399项目开发实录-板载OpenWRT系统的使用(wulianjishu666)

STM32F103单片机从零到项目开发程序实例 下载链接&#xff1a;https://pan.baidu.com/s/1dWNskNinrMk4bxaE-jgHhQ?pwdymn3 1. OpenWRT 手册 1.1. 支持设备列表 主控板卡型号RK3568ROC-RK3568-PC/Station-P2 1.2. 登录 IP 、登录密码和 WIFI 名称 固件默认登录 IP 为 192.1…

Linux Ncurses库部分函数使用说明

目录 1. initscr&#xff08;&#xff09;函数 2. endwin&#xff08;&#xff09;函数 3. curs_set()函数 4.noecho()函数 5. keypad()函数 6. start_color()函数 7.init_pair()函数 8.getch()函数 9.move()函数 10.addch()函数 11. refresh()函数 12.inch()函数…

【Linux 进程概念】

【Linux 进程概念】 冯诺依曼体系结构冯诺依曼结构简要解释&#xff1a;你用QQ和朋友聊天时数据的流动过程 操作系统(OperatorSystem)概念设计OS的目的定位操作系统的上下层都分别是什么如何理解“管理"总结 进程基本概念描述进程-PCBtask_ struct内容 组织进程查看进程通…

序列化与反序列化介绍

文章目录 一、序列化与反序列化二、PHP反序列化漏洞成因三、JAVA反序列化 一、序列化与反序列化 在PHP语言开发层面上基本都是围绕着serialize()&#xff0c;unserialize()这两个函数。serialize()函数序列化对象后&#xff0c;可以很方便的将它传递给其他需要它的地方&#x…

由浅到深认识Java语言(9):Eclipse IDE简介

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

【蓝桥杯入门记录】继电器、蜂鸣器及原理图分析

一、继电器、继电器概述 &#xff08;1&#xff09;蜂鸣器原理 蜂鸣器的发声原理由振动装置和谐振装置组成&#xff0c;而蜂鸣器又分为无源他激型与有源自激型&#xff0c;蜂鸣器的发声原理为: 1、无源他激型蜂鸣器的工作发声原理是&#xff1a;方波信号输入谐振装置转换为声…

稀碎从零算法笔记Day23-LeetCode:二叉树的最大深度

题型&#xff1a;链表、二叉树的遍历 链接&#xff1a;104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上…

ES集群不识别节点SSL证书的问题处理

问题描述 在启动ES服务并试图加入其他节点上已启动的集群时&#xff0c;出现报错(原文是一大段话&#xff0c;我按语义拆成了几段)&#xff1a; [2024-03-19T16:32:02,844][WARN ][o.e.c.s.DiagnosticTrustManager] [node-2-master] failed to establish trust with server a…

高压线下垂钓很危险!高压线下防垂钓智能语音警示杆:科技守护生命

初春时节&#xff0c;气温逐渐回升&#xff0c;在这阳光明媚的日子里&#xff0c;大批“捕鱼达人”纷纷开始行动&#xff0c;河边、池塘、水库……不放过任何一个垂钓点&#xff0c;甚至在高压线下&#xff0c;依旧自信甩杆&#xff0c;殊不知高压线下垂钓&#xff0c;轻则伤、…

聚类算法之层次聚类(Hierarchical Clustering)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 层次聚类是一种非常独特和强大的聚类方法&#xff0c;与众多其他的聚类技术相比&#xff0c;它不仅为数据集提供了一个划分&#xff0c;还给出了…

鸿蒙APP应用开发教程—超详细的项目结构说明

1. 新建项目 打开DevEco Studio, 选择 Create Project: 1.1 选择模版 Create Project - Choose Template 1.2 配置项目 Create Project - Configure Project 如果使用的是 DevEco 3.X 版本, 可以根据 Compile SDK版本选择不同的模式, 比如: 3.0.0(API 8)及更早 - 仅支持 …

【数据结构】堆和树详解堆和二叉树的实现堆的top-k问题

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;数据结构_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.树概念及结构 1.1 树的概念 2.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用 2.二叉树的概念及结构 2.1 二叉树的概念…

力扣389周赛复盘

字符串及其反转中是否存在同一子字符串 class Solution {public boolean isSubstringPresent(String s) {StringBuilder sb new StringBuilder(s);String reverse sb.reverse().toString(); for (int i 0; i < s.length() - 2; i) { // 修改循环终止条件为 <&#xf…

matlab实现对全球不规则投影数据的投影转换

前几个专栏我们讨论了几个不规则的投影转换问题&#xff0c;有需要的可以阅读以下文章&#xff1a; matlab实现对极地投影数据的投影转换_matlab极地投影-CSDN博客 联合matlab和Arcgis进行netcdf格式的雪覆盖数据的重新投影栅格-CSDN博客 这次遇到的问题是一个墨卡托投影的数据…

【JavaWeb】Spring非阻塞通信 - Spring Reactive之WebFlux的使用

【JavaWeb】Spring非阻塞通信 - Spring Reactive之WebFlux的使用 文章目录 【JavaWeb】Spring非阻塞通信 - Spring Reactive之WebFlux的使用参考资料一、初识WebFlux1、什么是函数式编程1&#xff09;面向对象编程思维 VS 函数式编程思维&#xff08;封装、继承和多态描述事物间…

vue3新功能-Teleport

1.teleport 在组件内的任何位置渲染内容 将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。 例:将组件dialog添加到body下面 <teleport to"body"> <el- dialog --> </teleport> 2.fragments 多个根元素外层不需要…

2024年了,还能学自动化吗?

大家都说2024年软件测试行业会卷的更厉害&#xff0c;简单的功能测试不再是入门的标准&#xff0c;那么2024年是否可以从自动化测试这块冲一把呢&#xff1f; 我们先来看看过去的一年自动化测试在测试行业中的发展分析&#xff1a; 01 市场需求增长 随着技术的进步和企业对软件…

爬虫入门系列-HTML基础语法

&#x1f308;个人主页&#xff1a;会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” HTML基础语法 bs4解析比较简单&#xff0c;但是呢&#xff0c;首先你需要了解一丢丢的html知识&#xff0c;然后再去使用bs4去提取&#xff0c;逻辑和编写难度就会非常简…