信号三大阶段之储存信号

news2024/9/20 18:47:05

目录

一、 信号三大阶段

二、信号储存相关概念

三、 理解概念

四、信号储存原理

五、信号集操作函数


一、 信号三大阶段

二、信号储存相关概念

  1. 实际执行信号的过程被称为信号递达(Delivery)。
  2. 信号从产生到递达之间的状态被称为信号未决(Pending)。
  3. 进程可以选择阻塞(Block)某个信号。
  4. 被阻塞的信号产生时将保存在未决状态,直到进程解除对此信号的阻塞,才会执行递达动作。
  5. 注意:阻塞和忽略是不同的,信号被阻塞就不会递达,而忽略是递达之后可以选择的一种执行方式。

三、 理解概念

理解一下过程:

一般来说,操作系统向进程写入一个信号,信号先是被阻塞(假设设置了对这个信号的阻塞)什么都不会做;接着进程解除了对该信号的阻塞,信号进入未决状态(就是进程执行相关任务前的这段时间);进程到了合适的时间,就会执行信号对应的相关操作(也就是信号递达)。

简单理解就是:写入信号——看是否被阻塞——解除阻塞进入未决状态——进程执行相关操作。

详细理解一下每个步骤:

1、假设你在读书的时候你很喜欢一个老师,老师在课上布置了一个课后作业,你把这个作业先记录到了小本子上面,然后回家后就立马写作业

这个例子话黑线部分就分别对应了信号未决状态信号递达状态

2、假设你一般喜欢另一个老师,但是他不怎么检查作业,一天上课它布置了一个课后作业,你也拿小本子记了下来,除了记在作业那一页,你还记在里另一页上表示这个作业不急着写,因为反正老师也不检查,你就想只完成例子一的作业不就行了。但是有一天这个老师说明天要检查作业,你就把它从不急着写那里划掉了然后晚上将这个作业完成

这个例子中的黑体分别对应了信号阻塞信号未决信号递达状态。

四、信号储存原理

 信号是被存放在进程里的,更具体的说,是存放在task_struct里的——用于管理进程的结构体。除了实时信号我们用的到的信号就31个,那么我们用一个int类型的数据就可以把一个信号储存起来——也就是位图结构,位图的位数表示几号信号,某一位上的0、1表示是否有接收到该信号。————这就对应了task_struct里的pending,这个几十用于存放信号的容器。

00000000000000000000000000000011 

这个就表示该进程接收到了12号信号。

同理的我们也可以用相同的结构,存放一些数据来表示一个信号是否被阻塞————与之对应的是block

00000000000000000000000000000001 

这里就表示1号进程被阻塞了。

这两个都是用sigset_t的数据类型。阻塞信号集也被称之为当前进程的信号屏蔽字,这里的屏蔽应该理解成阻塞而不是忽略。

还剩下一个非常关键的东西:handler数组。我们有31个信号,这个数组就有31个元素,分别对应接受到每个信号时,我们分别需要做什么。这也就是为什么一个进程会认识这些信号,因为收到信号要做什么都是早就被设置好的。

 

五、信号集操作函数

sigset_t 是一个操作系统内核中的数据结构,用于表示信号集。在使用信号相关的系统调用时,会涉及到对 sigset_t 进行操作,例如添加、删除、屏蔽、解除屏蔽等。这些操作需要使用一些特定的函数来实现,因为这些函数通常会与操作系统内核进行交互。此外,操作 sigset_t 需要涉及到底层的机制,例如信号处理器、信号屏蔽、信号队列等,这些机制通常需要由操作系统内核来管理。因此,只能使用函数来操作 sigset_t。

上面这段话总而言之就是:要对sigset_t进行操作只能通过一下几个函数:

#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. 函数sigemptysetchushihuaset所指向的信号集,使其所有bit位置0,表示该信号不包含任何有效信号。
  2. 函数sigfillset初始化set所指的信号集,使其中所有信号对应bit位置表示该信号集的有效信号集包括系统支持的所有信号。
  3. 注意,在使用sigset_t类型变量之前,一定要调用sigemptyset或者sigfill做初始化,使信号处于确定的状态,初始化sigset_t变量后就可以在调用sigaddset和sigdelset在该信号添加或者删除某种有效信号。
  4. 函数sigaddset,参数signo表示要在set信号集中添加哪个信号。
  5. 这四个函数都是成功返回0,失败返回-1.sigismenber是一个布尔函数,用于判断一个信号集的有效信号中是否包含某种信号,若包含则返回1,不包含则返回0,出错则返回-1。

上面这些函数都是对sigset_t信号集操作的,但是我要怎么阻塞或则读取信号呢?如果不能实现这个功能的话,那岂不是上面这些函数也没什么用呀。

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

 

#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
//返回值:成功返回0,失败返回-1
  1. 参数set就是我们上面用那些函数产生的一个sigset_t信号集。
  2. 参数oset是一个输出型参数,就是oldset的缩写,因为我们可能会对进程内原有的信号集进行修改,所以我们可以保留进程内原有的set,将它写入oset。
  3. 第一个参数how就是你希望执行的操作模式有一下三种:

 

函数sigpending()

#include <signal.h>
sigpending(&sigset_t set);
//读取当前进程的未决信号集,通过set参数传出。调用成功则返回0,出错则返回-1。 

实操例子:

运行结果:

 

 

 

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

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

相关文章

【Linux】初步认识Linux系统

Linux 操作系统 主要作用是管理好硬件设备&#xff0c;并为用户和应用程序提供一个简单的接口&#xff0c;以便于使用。 作为中间人&#xff0c;连接硬件和软件 常见操作系统 桌面操作系统 WindowsmacOsLinux 服务器操作系统 LinuxWindows Server 嵌入式操作系统 Linux …

从零搭建一台基于ROS的自动驾驶车-----1.整体介绍

系列文章目录 北科天绘 16线3维激光雷达开发教程 基于Rplidar二维雷达使用Hector_SLAM算法在ROS中建图 Nvidia Jetson Nano学习笔记–串口通信 Nvidia Jetson Nano学习笔记–使用C语言实现GPIO 输入输出 Autolabor ROS机器人教程 文章目录 系列文章目录前言一、小车底盘二、激…

Redis入门(三)

第5章 Redis的相关配置(redis.conf) 1&#xff09;计量单位说明,大小写不敏感 # 1k > 1000 bytes # 1kb > 1024 bytes # 1m > 1000000 bytes # 1mb > 1024*1024 bytes # 1g > 1000000000 bytes # 1gb > 1024*1024*1024 bytes # # units are case insensiti…

如何安装Apache服务

目录 什么是Apache 第一步 关闭防火墙和安全机制 第二步 系​统​上​定​义 SELinux 最​高​级​别 第三步 导入对应的依赖包并解包 第四步 安装依赖环境 第五步 移动相关文件 第六步 编译安装 第七步 编译 第八步 备份配置文件 第九步 优化执行路径 第十步 添加…

S32K324芯片学习笔记-实时控制系统-eMIOS

文章目录 Enhanced Modular IO Subsystem (eMIOS)eMISO配置通道类型通道配置BCTU Interface 简介功能框图Unified channels (UC)Buffered modesUC control and datapath diagramUC modesGPIO模式SAIC (Single Action Input Capture)模式Single Action Output Capture (SAOC) mo…

AI自动写代码:GitHub copilot插件在Idea的安装和使用教程

GitHub Copilot 是微软与OpenAI共同推出的一款AI编程工具&#xff0c;基于GitHub及其他网站的源代码&#xff0c;根据上文提示为程序员自动编写下文代码&#xff0c;可以极大地提高编写代码的效率。 先看看ChatGpt是怎么回答Copilot的功能特点&#xff1a; 给大家简单提取一…

【go】新手go module 踩坑入门rc_server

go1.3 后废弃了GOPATH 但是gomodule 要自己设置 :go env -w GO111MODULE=auto Microsoft Windows [版本 10.0.22621.1848] © Microsoft Corporation。保留所有权利。 C:\Users\zhangbin>adb connect 127.0.0.1:7555 connected to 127.0.0.1:7555 C:\Users\zhangbin&…

【计算机通识】未来的计算机

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、未来的计算机 2.1、光子计算机 2.2、生物计算机 2.3、量子计算机 3、总结 1、缘起 自然界中的一切事物都是处…

3d重建+神经渲染

3d重建 基于深度相机(结构光、TOF、双目摄像头)的三维重建基于图像的三维重建&#xff1a;深度学习基于视觉几何的传统三维重建&#xff1a;这种三维重建方法研究时间比较久远&#xff0c;技术相对成熟。主要通过多视角图像对采集数据的相机位置进行估计&#xff0c;再通过图像…

经典同步问题之哲学家就餐

文章目录 一&#xff1a;问题描述方案一&#xff1a;方案二&#xff1a;方案三&#xff1a; 一&#xff1a;问题描述 五个哲学家共用一张圆桌&#xff0c;分别坐在周围的五张椅子上&#xff0c;在圆桌上有五个碗和五只筷子&#xff0c;他们的生活方式是交替的进行思考和进餐。…

2023年测试岗前景?为什么要做自动化测试?8年测试总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自动化测试是把以…

Web网页制作期末复习(2)——常用文本标签、列表标签、表格标签、Form表单、块元素与行内元素(内联元素)

目录 常用文本标签 列表标签 有序列表 无序列表 定义列表 表格标签 表格组成与特点 表格标签 表格属性 ​​​合并表格单元格 Form表单 属性说明 表单元素 文本框 密码框 提交按钮 块元素与行内元素&#xff08;内联元素&#xff09; 内联元素和块级元素…

3、DuiLib了解xml的使用和布局

文章目录 1、了解 XML 使用和布局2、VerticalLayout和HorizontalLayout3、TabLayout4、TileLayout5、Container6、ChildLayout 1、了解 XML 使用和布局 本节主要介绍 DuiLib 中 XML 关键字的使用和一些特性&#xff0c;通过构建一个简单的带标题栏和简单结构的窗口&#xff0c…

模型分享---登陆注册界面

目录 模型---登陆注册界面 验证码的生成&#xff1a; CheckCodeUtil.java&#xff1a; Servlet: 普通用户登陆&#xff1a; css: jsp: 运行结果&#xff1a; 管理员登陆&#xff1a; 运行结果&#xff1a; 注册&#xff1a; 普通用户&#xff1a; css: jsp: 运行…

FreeRTOS实时操作系统(三)任务挂起与恢复

系列文章目录 FreeRTOS实时操作系统&#xff08;一&#xff09;RTOS的基本概念 FreeRTOS实时操作系统&#xff08;二&#xff09;任务创建与任务删除&#xff08;HAL库&#xff09; 文章目录 系列文章目录前言任务挂起与恢复普通挂起恢复实例中断恢复实例 前言 继续跟着正点…

记录--封装一个通过js调用的全局vue组件

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 在使用vue项目编写的时候&#xff0c;不可避免的会碰到需要时js api来调用组件进行显示的情况 例如饿了么element ui 的 Notification 通知、Message 消息提示等组件 虽然已经提供了&#xff0c;…

postman和jmete接口测试的用法与区别

目录 前言 接口测试的目的 接口测试怎么测&#xff1a; 1.创建接口用例集&#xff08;没区别&#xff09; 2.步骤的实现&#xff08;有区别&#xff09; 3数据用例的实现 4断言的实现 5执行 6其他 总结&#xff1a; 前言 前阶段做了一个小调查&#xff0c;发现软件测…

DETR 系列有了新发现?DETRs with Hybrid Matching 论文阅读笔记

DETR 系列有了新发现&#xff1f;DETRs with Hybrid Matching 论文阅读笔记 一、Abstract二、引言三、相关工作目标检测中的 DETR其它视觉任务中的 DETR标签赋值 四、方法4.1 基础知识通用的 DETR 框架通用的可变形 Deformable-DETR 框架 4.2 混合匹配4.2.1 混合分支计划一对一…

client-go的Indexer三部曲之三:源码阅读

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 《client-go的Indexer三部曲》全部链接 基本功能性能测试源码阅读 本篇概览 本文是《client-go的Indexer三部曲》系列的终篇&#xff0c;主要任务是阅读和…

Vue全家桶(四):Vue Router 路由

目录 Vue Router1. 相关理解1.1 Vue Router的理解1.2 对SPA应用的理解1.3 路由的理解 2. 基本路由2.1 vue-router使用步骤2.2 几个注意点2.3 触发路由2.4 嵌套路由2.5 路由传递参数方式2.5.1 params 方式2.5.2 Query的方式 2.6 命名路由2.7 路由的props配置2.8 路由跳转的repla…