Linux 信号集与信号掩码

目录
一、引言
二、信号集是什么
三、信号集关键函数
1.信号集的创建与初始化
2.信号的添加与删除
3.信号集的阻塞与解除阻塞
四、信号集实际应用场景
五、信号掩码的作用
六、信号掩码相关函数
1.sigprocmask 函数
2.sigemptyset 和 sigfillset 函数
七、信号掩码注意事项
八、总结
一、引言
在 Linux 系统编程中,信号集和信号掩码是处理信号机制不可或缺的部分。它们能够让开发者精细地控制进程对信号的接收和处理,对程序的稳定性和可靠性有着至关重要的作用。信号是一种软中断,用于通知进程发生了特定的事件。例如,当用户在终端按下 Ctrl + C 时,内核会向当前前台进程发送 SIGINT 信号,进程收到此信号后通常会终止运行。
二、信号集是什么
信号集本质上是一个数据结构,用于表示多个信号的集合。在 Linux 中,信号是用于进程间异步通知的一种机制,比如当子进程结束时,会向父进程发送 SIGCHLD 信号。而信号集就是用来对这些信号进行集中管理和操作的,常见的操作包括信号的添加、删除以及判断某个信号是否在集合中。
三、信号集关键函数
1.信号集的创建与初始化
使用 sigemptyset 函数可以创建一个空的信号集,即将信号集中的所有信号都设置为未决状态。与之相对的是 sigfillset 函数,它会将所有信号添加到信号集中,使其处于阻塞状态。例如:
sigset_t set;
sigemptyset(&set); // 创建空信号集
sigaddset(&set, SIGINT); // 向信号集中添加 SIGINT 信号
2.信号的添加与删除
sigaddset 函数用于向信号集中添加指定的信号,而 sigdelset 函数则用于从信号集中删除指定的信号。通过这两个函数,可以灵活地定制信号集的组成。
3.信号集的阻塞与解除阻塞
sigprocmask 函数是控制信号阻塞的关键。它可以根据给定的信号集,阻塞或解除阻塞相应的信号。例如,以下代码可以阻塞 SIGINT 信号:
sigset_t block_set;
sigemptyset(&block_set);
sigaddset(&block_set, SIGINT);
sigprocmask(SIG_BLOCK, &block_set, NULL);
当不需要阻塞时,可以使用 SIG_UNBLOCK 操作来解除阻塞。
四、信号集实际应用场景
信号集在很多系统编程场景中都有广泛应用。比如在服务器编程中,父进程创建多个子进程来处理客户端请求时,父进程可以使用信号集来阻塞 SIGCHLD 信号,然后在合适的时候通过 sigwait 等函数来等待子进程结束的信号,从而避免僵尸进程的产生,并且能够高效地回收子进程资源。
五、信号掩码的作用
信号掩码主要用于控制进程对信号的响应行为。当一个信号被添加到进程的信号掩码中时,进程在当前时刻将暂时不会接收到该信号,即信号被阻塞。这在一些特定场景下非常有用,例如在进程执行关键代码段时,不希望被某些信号中断,就可以将这些信号添加到信号掩码中,待关键代码段执行完毕后,再解除对这些信号的阻塞,从而保证程序的稳定性和数据的一致性。
六、信号掩码相关函数
1.sigprocmask 函数
这是操作信号掩码的核心函数。它可以用来设置、获取或修改进程的信号掩码。函数原型如下:
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
how 参数指定了操作方式,常见的取值有:
- SIG_BLOCK:将 set 指向的信号集中的信号添加到当前信号掩码中,即阻塞这些信号。
- SIG_UNBLOCK:将 set 指向的信号集中的信号从当前信号掩码中移除,即解除对这些信号的阻塞。
- SIG_SETMASK:直接将当前信号掩码设置为 set 指向的信号集。
set 参数是一个指向信号集的指针,用于指定要操作的信号集合。如果不需要改变信号掩码,该参数可以设置为 NULL。
oldset 参数也是一个指向信号集的指针,用于保存原有的信号掩码。如果不需要获取原信号掩码,该参数也可以设置为 NULL。
2.sigemptyset 和 sigfillset 函数
在使用 sigprocmask 函数前,通常需要先创建一个信号集,并通过 sigemptyset 函数将其初始化为空集(即不包含任何信号),或者使用 sigfillset 函数将其初始化为包含所有信号的集合,然后根据具体需求使用 sigaddset 或 sigdelset 函数向信号集中添加或删除特定的信号。
例如,以下代码片段展示了如何使用这些函数来阻塞 SIGINT 信号,并在一段时间后解除阻塞:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>int main() {sigset_t block_set, old_set;// 初始化信号集为空集sigemptyset(&block_set);// 将 SIGINT 信号添加到要阻塞的信号集中sigaddset(&block_set, SIGINT);// 设置信号掩码,阻塞 SIGINT 信号,并保存原信号掩码sigprocmask(SIG_BLOCK, &block_set, &old_set);printf("SIGINT is blocked. Press Ctrl+C to test...\n");sleep(5);// 恢复原信号掩码,解除对 SIGINT 的阻塞sigprocmask(SIG_SETMASK, &old_set, NULL);printf("SIGINT is unblocked.\n");return 0;
}
七、信号掩码注意事项
在使用信号掩码时,需要谨慎考虑阻塞信号的时长和范围。过度或不合理地阻塞信号可能会导致进程错过重要的事件通知,从而影响程序的正常运行。例如,如果长时间阻塞与进程终止相关的信号(如 SIGTERM),可能会使进程在需要被关闭时无法及时响应,造成资源无法释放等问题。同时,在多线程环境下,信号掩码的操作会影响整个进程,而不仅仅是当前线程,因此需要更加小心地处理信号掩码,避免对其他线程的信号处理产生意外影响。
八、总结
信号集和信号掩码是Linux信号处理中的重要工具。信号集提供了一种方便的方式来组织和管理信号,而信号掩码则允许我们精确地控制进程对信号的接收。理解和掌握它们的概念和操作方法,能够帮助我们更好地编写健壮、高效的Linux程序,提升程序在复杂环境下应对各种事件的能力。
相关文章:
Linux 信号集与信号掩码
目录 一、引言 二、信号集是什么 三、信号集关键函数 1.信号集的创建与初始化 2.信号的添加与删除 3.信号集的阻塞与解除阻塞 四、信号集实际应用场景 五、信号掩码的作用 六、信号掩码相关函数 1.sigprocmask 函数 2.sigemptyset 和 sigfillset 函数 七、信号掩码注…...
如何设置Edge浏览器访问软件
使用Edge浏览器访问分销ERP A\V系列软件时会出现各种报错,如何设置Edge浏览器使其正常访问,请看下面的具体操作。 一、打开Edge浏览器,点击右上角的 设置及其他,如图: 二、在弹出界面中,点击 扩展ÿ…...
DL笔记:旋转编码RoPE
1 背景 由于计算资源限制,目前的LLM大多在较短的上下文长度中进行训练,在推理中,如果超出预训练的长度,模型的性能将会显著降低 ——>需要一个可提供外推性的位置编码最经典的绝对位置编码就是原始Transformer中的那个sinusoi…...
C语言自定义类型与文件操作
构造类型 枚举类型 若定义不相关的常量使用宏定义;若定义一组相关的常量使用枚举。switch中case后访问的就是枚举。 定义: 我们一般情况下定义常量使用宏定义(#define),宏定义适合没有关联关系的常量;但有时需要对一组有关联关系…...
《计算机网络A》单选题-复习题库解析-3
目录 106、MAN通常是指( ) 107、下列因素中,不会影响信道数据传输速率的是( ) 108、以太网交换机进行转发决策时使用的PDU地址是( ) 109、下列机制中,可以解决因数据帧丢失而…...
VM虚拟机配置ubuntu网络
目录 桥接模式 NAT模式 桥接模式 特点:ubuntu的IP地址与主机IP的ip地址不同 第一部分:VM虚拟机给ubuntu的网络适配器,调为桥接模式 第二部分:保证所桥接的网络可以上网 第三部分:ubuntu使用DHCP(默认&…...
【每日学点鸿蒙知识】Web高度适配、变量声明规范、动画取消、签名文件、包体积优化相关
1、HarmonyOS Web页面高度适配? 在Web页面设置高度100%时,发现和Web控件的高度不一致,这个需要设置什么可以达到页面高度和Web容器高度一致 目前只支持两种web布局模式,分别为Web布局跟随系统WebLayoutMode.NONE和Web基于页面大…...
uniapp使用ucharts组件
1.ucharts准备 有两种使用方式:一种是在uni的插件市场下载(组件化开发)。一种是手动引入ucharts包。官方都封装好组件了,我们不用岂不是浪费。 直接去dcloud插件市场(DCloud 插件市场)找,第一…...
LabVIEW工程师的未来发展
对于LabVIEW工程师以及更广义的编程从业者(包括“高级民工”码农)来说,随着AI技术和软件编程的逐步成熟,确实面临一些新的挑战和机遇。以下是对此问题的深入分析和未来方向的建议: 现状分析:技术过剩与竞争…...
java的bio、nio、aio 以及操作系统的select、poll、epoll
在 Java 和其他编程语言中,I/O 模型的选择对网络应用的性能和可扩展性有着重要影响。以下是 BIO(Blocking I/O)、NIO(Non-blocking I/O)、AIO(Asynchronous I/O),以及操作系统级别的…...
2024 年发布的 Android AI 手机都有什么功能?
大家好,我是拭心。 2024 年是 AI 快速发展的一年,这一年 AI 再获诺贝尔奖,微软/苹果/谷歌等巨头纷纷拥抱 AI,多款强大的 AI 手机进入我们的生活。 今年全球 16% 的智能手机出货量为 AI 手机,到 2028 年,这…...
RLHF,LM模型
LLM(Large Language Model) RLHF(Reinforcement Learning from Human Feedback),即以强化学习方式依据人类反馈优化语言模型。 RLHF思想:使用强化学习的方式直接优化带有人类反馈的语言模型。RLHF使得在一般文本数据语料库上训练的语言模型能与复杂的人类价值观对齐。 R…...
【机器学习】工业 4.0 下机器学习如何驱动智能制造升级
我的个人主页 我的领域:人工智能篇,希望能帮助到大家!!!👍点赞 收藏❤ 随着科技的飞速发展,工业 4.0 浪潮正席卷全球制造业,而机器学习作为这一变革中的关键技术,正以前…...
REST与RPC的对比:从性能到扩展性的全面分析
在微服务架构中,服务间通信是核心问题之一。常见的两种通信方式是REST(Representational State Transfer)和RPC(Remote Procedure Call)。它们各有优缺点,适用于不同场景。本文将从性能、扩展性、兼容性和开…...
MATLAB中将MAT文件转换为Excel文件
MATLAB中将MAT文件转换为Excel文件 MATLAB提供了多种方法将MAT文件中的数据导出到Excel文件中。下面介绍几种常用的方法: 1. 使用 writetable 函数 优点: 功能强大,可以灵活控制输出格式。用法: data load(your_data.mat); …...
leetcode hot 100 跳跃游戏2
45. 跳跃游戏 II 已解答 中等 相关标签 相关企业 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 < j…...
【Cesium】八、Cesium 默认地图不显示,不加载默认Bing地图
文章目录 前言实现方法App.vue 前言 Cesium 默认加载的地图是bing地图,个人认为请求bing地图会收到网络限制,导致地图资源下载很慢,所以设置默认不加载bing地图(后续我使用的是天地图) 参考文章: cesium …...
【新方法】通过清华镜像源加速 PyTorch GPU 2.5安装及 CUDA 版本选择指南
下面详细介绍所提到的两条命令,它们的作用及如何在你的 Python 环境中加速 PyTorch 等库的安装。 1. 设置清华镜像源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple这条命令的作用是将 pip (Python 的包管理工具…...
MySQL的sql操作有哪些
MySQL 的 SQL 操作可以分为几个主要类别,每个类别包含了一系列的语句,用于执行不同的数据库操作: 数据查询语言(DQL) SELECT:用于从一个或多个表中检索数据。可以使用 WHERE 子句进行条件筛选,…...
ArcGIS计算矢量要素集中每一个面的遥感影像平均值、最大值等统计指标
本文介绍在ArcMap软件中,基于矢量面要素集,计算在其中每一个面区域内,遥感影像的像元个数、平均值、总和等统计值,并将统计信息附加到矢量图层的属性表中的方法。 首先,明确一下本文的需求。现在有一个矢量面要素集&am…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
