【Linux信号】阻塞信号、信号在内核中的表示、信号集操作函数、sigprocmask、sigpending

我们先来了解一下关于信号的一些常见概念:

实际执行 信号的处理动作 称为信号递达。

信号从产生到递达的之间的状态称为信号未决。

进程可以选择阻塞(Block)某个信号。

被阻塞的信号产生时是处于未决状态的,知道进程解除对该信号的阻塞,该信号才可以进行递达!

阻塞和忽略是不同的。阻塞的信号是不会递达的,而忽略是在递达后可选的一种处理动作。

信号在内核中的表示信号阻塞的理解

Linux内核中每个进程的PCB里都有存储信号的结构。如下是信号在内核PCB里的表示示意图:

每个信号都有两个标志位分别表示阻塞(block)和未决(pending),还有一个函数指针数组(handler)表示对信号的处理动作。

阻塞(block):代表的是一个位图(其实就是一个整型int变量),该位图由32个bit位组成其下标表示信号的编号,bit位的数值为0代表该位置编号对应的信号没有被阻塞;值为1代表该位置编号对应的信号被阻塞。

未决(pending):同样也是一个与block一样的位图,信号产生时,OS在进程控制块中设置该信号的未决标志,直到信号递达才清除该标志。

在上示意图中,SIGHUP信号未阻塞也未产生过,当它递达时执行默认处理动作。
SIGINT信号产生过,但正在被阻塞,所以暂时不能递达。虽然它的处理动作是忽略,但在没有解除阻塞之前不能忽略这个信号,因为进程仍有机会改变处理动作之后再解除阻塞。
SIGQUIT信号未产生过,一旦产生SIGQUIT信号将被阻塞,它的处理动作是用户自定义函数sighanlder。
如果在进程解除对某信号的阻塞之前这种信号产生过多次,将如何处理?
Linux允许系统递送该信号一次或多次。

sigset_t

sigset_t称为信号集类型,每个信号只有一个bit的未决标志,0或1,不记录该信号产生了多少次,阻塞标志也是这样表示的。因此,未决和阻塞标志可以用相同的sigset_t数据类型变量来存储。

信号集操作函数

用来操作sigset_t数据类型变量的函数。

头文件: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);
sigismember是一个布尔函数用于判断一个信号集的有效信号中是否包含某种信号,若包含则返回1,不包含则返回0,出错返回-1
函数返回值:这四个函数都是成功返回 0, 出错返回 -1
注意:在使用sigset_ t类型的变量之前,一定要调 用sigemptyset或sigfillset做初始化,使信号集处于确定的状态。初始化sigset_t变量之后就可以在调用sigaddset和sigdelset在该信号集中添加或删除某种有效信。

sigprocmask

功能:可以读取或更改进程的信号屏蔽字(阻塞信号集)

参数how:

返回值:调用成功则返回0,出错则返回-1

sigpending

功能:读取当前进程的未决信号集,通过set参数传出。

返回值:调用成功则返回0,出错则返回-1

sigprocmask和sigpending都是系统调用

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

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

相关文章

零信任作为解决方案,Hvv还能打进去么?

零信任平台由“中心组件服务”三大部分构成,以平台形式充分融合软件定义边界(SDP)、身份与访问管理(IAM)、微隔离 (MSG)的技术方案优势,通过关键技术的创新,实现最佳可信…

Vue中的Mixins与钩子函数:理解合并与调用

在Vue的开发过程中,mixins是一个非常有用的特性,它允许我们跨多个组件共享可复用的代码。然而,当我们在组件与mixins之间定义同名的钩子函数或方法时,理解它们之间的相互作用和合并机制就显得尤为重要。 在Vue.js中,对…

Reinforement Learning学习记录(五)

前言 最近两周的工作主要是在做方向的探索和相关论文的学习,这次的介绍会分为,项目介绍,论文学习,当前进度,未来计划 项目介绍 最近主要是尝试了两个大类的项目,第一个是视觉追踪,第二个是三维重建 视觉跟踪 视觉追踪的话,参考了这几个开源项目: CoTracker: It i…

手机数据恢复篇:如何从 Android 手机恢复消失的照片

丢失 Android 手机中的照片现在已成为您可能遇到的最糟糕的情况之一。随着手机在相机方面越来越好,即使是那些不热衷于拍照的人也成为了摄影师。 如今,人们可以随时随地拍摄照片,每一张照片都保存着回忆和数据,因此,丢…

变得越来越优秀的方法

反省后看到问题很正常,接纳-行动-改变-能量-帮助-成长变优秀;温和后需要【中庸智慧】灵活处世,不做老好人,须有原则有框架! —— 只有深刻地反省,我们才能真正地认识自己,我们反省后会看到自己…

昇思25天学习打卡营第19天|应用实践之基于MobileNetv2的垃圾分类

基本介绍 今天的应用实践是垃圾分类代码开发,整体流程是读取本地图像数据作为输入,对图像中的垃圾物体进行检测,并且将检测结果图片保存到文件中。采用的是MobileNetv2模型,使用官方提供的数据集,数据集分为4大类&…

python如何与前端交互

文章目录 1. 选择一个 Python Web 框架2. 创建 Web 应用程序3. 编写后端逻辑4. 编写前端代码5. 连接前后端6. 部署和测试扩展Jupyter Notebook Python 与前端(如 HTML, CSS, JavaScript)的关联通常是通过 Web 框架来实现的,这些框架允许 Pyth…

维度的自定义标签:Kylin Cube设计中的元数据支持

维度的自定义标签:Kylin Cube设计中的元数据支持 在数据分析的多维世界中,Apache Kylin的Cube设计提供了强大的灵活性,允许用户根据需求定制化地分析数据。维度的自定义元数据是这一灵活性的体现之一,它允许用户为维度添加额外的…

【MySQL】8.复合查询

复合查询 一.基本查询回顾(新增子查询)二.多表查询三.自连接四.子查询1.单列单行子查询2.单列多行子查询——三个关键字3.多列子查询4.在 from 子句中使用子查询 五.合并查询六.总结 一.基本查询回顾(新增子查询) //1.查询工资高于500或岗位为MANAGER的雇员,同时还…

Python高级(四)_内存管理

Python高级-内存管理 第四章 内存管理 1、对象池 小整数池 系统默认创建好的,等着你使用 概述:整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁内存空间。Python 对小整数的定义是 [-5, 256] ,这些整数对象是提前建立好的…

C语言——循环结构:while、do...while、for

while循环 基本结构 C语言中的while循环是一种基本的循环控制结构,它允许程序重复执行一段代码块,直到指定的条件不再满足为止。while循环的语法结构如下: while (condition) { // 循环体 // 在这里编写要重复执行的代码 } condition …

Avalonia创建导航菜单

1. 简介 已开源,后续还会继续更新学习到的内容,欢迎Star,GitHub地址 开发Avalonia需要的一些资料,我已经分享到另一篇文章 示意图 涉及到内容: MVVM路由模板 开发: 开发工具:Rider&#x…

acnconda虚拟环境管理笔记

虚拟环境 conda create --name photos_com python3.8 conda info --envs activate 环境名 conda install -n 环境名 包名 conda remove --name 环境名 包名 虚拟环境基本操作 下面以例子来说明怎么建立、使用或是删除虚拟环境。比如:想新建一个名为 ‘pytest’ 的虚…

【linux】进程间通信(IPC)——匿名管道,命名管道与System V内核方案的共享内存,以及消息队列和信号量的原理概述

目录 ✈必备知识 进程间通信概述 🔥概述 🔥必要性 🔥原理 管道概述 🔥管道的本质 🔥管道的相关特性 🔥管道的同步与互斥机制 匿名管道 🔥系统调用接口介绍 🔥内核原理 …

C++ QT开发 学习笔记(1)

C QT开发 学习笔记(1) 考试系统 创建项目 新建Qt桌面应用程序,项目名:ExamSys。 类信息:类名LoginDialog继承自QDialog (1) ExamSys.pro 工程文件,包含当前工程的相关信息。 QDialog 是 Qt 框架中用…

二、计划任务

1.什么是计划任务 对于一些特定的任务,可以设定任务,让服务在规定时间去执行 2.windows中的计划任务 打开控制面板》管理工具》任务计划程序》创建基本任务 3.linux中的计划任务 周期性的计划crontab crontab -l :显示当前的计划惹怒我 -e&#…

大健康产业运营模式|大健康行业商业模式|健康管理盈利模式

大家好!今天我们来聊聊如何在大健康行业中选择一个适合自己的商业模式,从保健、医疗、健身、美容、养老等方面快速发展并取得成功。 首先,大健康行业涵盖了很多领域,但最核心的是保健和医疗,这两者是保障大家健康的基础…

通过maven基于springboot项目构建脚手架archetype

1、引入脚手架构建的插件依赖 <!--构建脚手架archetype--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-archetype-plugin</artifactId><version>3.2.1</version></plugin><plugin><…

从零开始学习嵌入式----自定义函数实现strcpy与strcat功能

目录 一、自定义函数实现strcpy功能&#xff1a; 二、自定义函数实现strcat功能 一、自定义函数实现strcpy功能&#xff1a; #include <stdio.h> void fun(char *p,char *q) {while(*q)*p*q;*p\0; } int main() {char str[32]"";fun(str,"hello");…

【Visual Studio】Visual Studio使用技巧及报错解决合集

目录 目录 一.概述 二.Visual Studio报错问题及解决方法 三.Visual Studio操作过程中遇到的问题及解决方法 四.Visual Studio编译优化选项 五.Visual Studio快捷键 一.概述 持续更新Visual Studio报错及解决方法&#xff0c;包括Visual Studio报错问题及解决方法、Visua…