Linux信号机制详解:阻塞信号集与未决信号集

文章目录

    • 前言
    • 1. 阻塞信号集(Signal Mask)
    • 2. 未决信号集(Pending Signal Set)
    • 3. 两者关系与信号递达流程
    • 4. 相关系统调用简要说明
    • 5. 示例代码片段(查看 pending 与 mask)
    • 6.示例代码详解
      • 6.1 print_sigset函数
      • 6.2 main函数
        • 6.2.1 信号集初始化与阻塞
        • 6.2.2 等待用户发送信号
        • 6.2.3 查看挂起信号
        • 6.2.4 解除信号阻塞
      • 6.3 执行流程
      • 6.4 关键知识点
      • 6.5 程序运行结果分析
      • 6.6 信号处理机制详解

前言

在 Linux 系统中,信号(signal)是进程间通信(IPC)的一种机制,用于通知进程发生了某种事件。为了更精细地控制信号的处理行为,内核为每个进程维护了两个关键的信号集合:

阻塞信号集(Blocked Signal Set / Signal Mask)
未决信号集(Pending Signal Set)
这两个集合都以位掩码(bitmask)的形式表示,通常称为 sigset_t 类型。

1. 阻塞信号集(Signal Mask)

定义:当前被阻塞、暂不递达的信号集合。
作用:即使某个信号已经发送给进程,只要它在阻塞集中,就不会被立即处理(即不会触发信号处理函数或默认动作),而是被挂起(pending)。
修改方式:通过 sigprocmask() 系统调用修改当前进程的信号掩码。
特点:
是可编程控制的;
对实时信号(如 SIGRTMIN~SIGRTMAX)和标准信号均有效;
子进程会继承父进程的信号掩码(在 fork 时)。

2. 未决信号集(Pending Signal Set)

定义:已经发送给进程、但尚未被递达(因为被阻塞或正在处理)的信号集合。
作用:记录哪些信号“在路上”,等待解除阻塞后处理。
查看方式:可通过 sigpending() 系统调用获取当前进程的 pending 信号集。
特点:
内核自动维护,用户无法直接修改;
对于标准信号(如 SIGINT、SIGTERM),多次发送只保留一个(不可排队);
对于实时信号(POSIX Realtime Signals),可以排队(多个实例可 pending)。

3. 两者关系与信号递达流程

当一个信号被发送给进程时,内核执行如下逻辑:
检查该信号是否在 阻塞信号集(mask) 中:
如果 不在 → 立即递达(调用 handler 或执行默认动作);
如果 在 → 将该信号加入 未决信号集(pending),暂不处理。
当进程后续通过 sigprocmask() 解除对该信号的阻塞 时:
内核检查 pending 集合;
若该信号处于 pending 状态,则立即递达。
注意:信号的“递达”发生在进程从内核态返回用户态时(例如系统调用返回、中断返回等),这是信号处理的“时机点”。

4. 相关系统调用简要说明


sigsuspend 常用于“等待特定信号”的场景,它能避免竞态条件(race condition):先解除阻塞再 sleep 可能错过信号,而 sigsuspend 是原子操作。

5. 示例代码片段(查看 pending 与 mask)

#include<signal.h>#include<stdio.h>#include<unistd.h>voidprint_sigset(constsigset_t*set){for(inti=1;i<NSIG;i++){if(sigismember(set,i))printf(" %d",i);}printf("\n");}intmain(){sigset_tmask,pending;// 阻塞 SIGINT (Ctrl+C)sigemptyset(&mask);sigaddset(&mask,SIGINT);sigprocmask(SIG_BLOCK,&mask,NULL);printf("Blocked SIGINT. Now send SIGINT (e.g., press Ctrl+C).\n");sleep(3);// 此时 SIGINT 被阻塞,应进入 pendingsigpending(&pending);printf("Pending signals:");print_sigset(&pending);printf("Unblocking SIGINT...\n");sigprocmask(SIG_UNBLOCK,&mask,NULL);// 此时会立即处理 pending 的 SIGINTreturn0;}

6.示例代码详解

运行此程序,在 sleep 期间按 Ctrl+C,会看到 SIGINT 被 pending,解除阻塞后进程退出。
这是一个用于演示Linux信号处理机制的C程序,主要功能是阻塞、查看和解除阻塞SIGINT信号(通常由Ctrl+C触发)。

6.1 print_sigset函数

voidprint_sigset(constsigset_t*set){for(inti=1;i<NSIG;i++){if(sigismember(set,i))printf(" %d",i);}printf("\n");}

功能:打印信号集中的所有信号编号
参数:set - 指向信号集的指针
实现:
遍历从1到NSIG(系统支持的最大信号数)的所有信号
使用sigismember()函数检查每个信号是否在信号集中
如果存在,则打印该信号编号

6.2 main函数

6.2.1 信号集初始化与阻塞
sigset_tmask,pending;// 阻塞 SIGINT (Ctrl+C)sigemptyset(&mask);sigaddset(&mask,SIGINT);sigprocmask(SIG_BLOCK,&mask,NULL);

sigset_t: 定义信号集类型的变量
sigemptyset(): 初始化信号集为空
sigaddset(): 将SIGINT信号添加到信号集中
sigprocmask(SIG_BLOCK, &mask, NULL): 阻塞mask中包含的所有信号(这里是SIGINT)

6.2.2 等待用户发送信号
printf("Blocked SIGINT. Now send SIGINT (e.g., press Ctrl+C).\n");sleep(3);// 此时 SIGINT 被阻塞,应进入 pending

提示用户发送SIGINT信号
sleep(3): 程序休眠3秒,期间如果用户按下Ctrl+C,SIGINT信号会被阻塞并进入挂起状态

6.2.3 查看挂起信号
sigpending(&pending);printf("Pending signals:");print_sigset(&pending);

sigpending(&pending): 获取当前挂起的所有信号,并存储到pending信号集中
调用print_sigset()打印所有挂起的信号

6.2.4 解除信号阻塞
printf("Unblocking SIGINT...\n");sigprocmask(SIG_UNBLOCK,&mask,NULL);// 此时会立即处理 pending 的 SIGINT

sigprocmask(SIG_UNBLOCK, &mask, NULL): 解除mask中包含的所有信号的阻塞
当SIGINT信号解除阻塞后,系统会立即处理之前挂起的SIGINT信号,导致程序终止

6.3 执行流程

程序开始执行,初始化信号集
阻塞SIGINT信号
提示用户发送SIGINT信号并休眠3秒
如果用户在3秒内按下Ctrl+C,SIGINT信号被阻塞并进入挂起状态
程序醒来后,检查并打印所有挂起的信号
解除SIGINT信号的阻塞,系统立即处理挂起的SIGINT信号
程序终止

6.4 关键知识点

信号集(sigset_t):用于表示一组信号的数据结构
sigprocmask():修改进程的信号屏蔽字,控制哪些信号可以递送到进程
sigpending():获取当前挂起的所有信号
SIG_BLOCK:向信号屏蔽字添加信号
SIG_UNBLOCK:从信号屏蔽字移除信号
挂起信号(pending signals):已发送但被阻塞的信号
这个程序很好地演示了Linux信号处理中的阻塞和挂起机制,帮助理解信号如何在进程中被处理。

6.5 程序运行结果分析

第一次运行

xxx:~/Cprogram$./sigtest Blocked SIGINT.Now sendSIGINT(e.g.,press Ctrl+C).^CPending signals:2Unblocking SIGINT...

关键观察点:
程序启动后,成功阻塞了SIGINT信号
在3秒等待期间按下了Ctrl+C(显示为^C)
程序检测到并输出了挂起的信号:Pending signals: 2,其中2是SIGINT信号的编号
解除SIGINT阻塞后,系统立即处理了挂起的SIGINT信号,导致程序终止

第二次运行

xxx:~/Cprogram$./sigtest Blocked SIGINT.Now sendSIGINT(e.g.,press Ctrl+C).Pending signals:Unblocking SIGINT...

关键观察点:
程序同样成功阻塞了SIGINT信号
但这次在3秒等待期间没有按下Ctrl+C
因此程序检测到的挂起信号列表为空:Pending signals:后没有任何信号编号
解除SIGINT阻塞后,没有需要处理的挂起信号,程序正常执行完毕

6.6 信号处理机制详解

信号编号
SIGINT信号的编号是2,这是由系统定义的标准信号编号。可以通过kill -l命令查看所有信号的编号。
信号状态转换
信号发送:当按下Ctrl+C时,终端会向当前前台进程组发送SIGINT信号
信号阻塞:由于程序使用sigprocmask(SIG_BLOCK, &mask, NULL)阻塞了SIGINT信号,该信号无法立即递送到进程
信号挂起:被阻塞的信号会进入"挂起"状态,保存在进程的挂起信号集合中
检查挂起:通过sigpending()函数可以查询当前挂起的信号集合
解除阻塞:当使用sigprocmask(SIG_UNBLOCK, &mask, NULL)解除SIGINT的阻塞后,挂起的SIGINT信号会立即递送到进程
信号处理:SIGINT的默认处理动作是终止进程,所以程序会立即终止
程序行为差异的原因
两次运行的差异完全是由是否在等待期间发送SIGINT信号导致的:
第一次运行:发送了SIGINT → 信号挂起 → 解除阻塞后处理信号 → 程序终止
第二次运行:未发送SIGINT → 无挂起信号 → 解除阻塞后正常退出

代码与运行结果的对应关系

// 阻塞SIGINT信号sigprocmask(SIG_BLOCK,&mask,NULL);printf("Blocked SIGINT. Now send SIGINT (e.g., press Ctrl+C).\n");sleep(3);// 这里是接收Ctrl+C的窗口// 检查挂起信号sigpending(&pending);printf("Pending signals:");print_sigset(&pending);// 这里输出是否有挂起的SIGINT(2)// 解除阻塞sigprocmask(SIG_UNBLOCK,&mask,NULL);// 此时会立即处理挂起的SIGINT

实际应用场景
信号阻塞机制在实际编程中有很多应用,例如:
原子操作保护:在执行关键的原子操作时,暂时阻塞某些信号,避免操作被中断
信号处理时序控制:控制信号处理的时机,确保在合适的时候处理信号
信号批量处理:先累积多个相同信号,然后在合适的时候一次性处理
这个程序很好地演示了Linux信号机制的基本概念,包括信号阻塞、挂起和处理的整个流程。

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

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

相关文章

2026液体钙品牌竞争力榜单:科学补钙,选对不选贵 - 速递信息

液体钙因小分子易吸收、肠胃刺激小的优势,成为全人群补钙的优选剂型。2026年市面上液体钙品牌百花齐放,但配方科学性、吸收效率、安全性差异显著。本次榜单基于权威检测数据、用户真实反馈及配方协同性分析,筛选出6…

哺乳期补钙不踩坑!孕哺专研液体钙,守护母婴双重健康 - 速递信息

对于哺乳期妈妈而言,喂奶不仅是亲子间的温情联结,更是一场“营养透支”的考验。研究表明,哺乳期妈妈每天通过乳汁流失的钙高达300mg,而我国哺乳期女性每日膳食钙平均摄入量仅296.1mg,远低于《中国居民膳食营养素参…

CES 2026封神时刻:80TOPS算力引爆AI PC革命,本地大模型时代正式降临

CES 2026封神时刻&#xff1a;80TOPS算力引爆AI PC革命&#xff0c;本地大模型时代正式降临拉斯维加斯的霓虹尚未褪去&#xff0c;CES 2026已为全球科技行业刻下全新坐标——AI PC不再是概念性的点缀&#xff0c;而是以80TOPS算力为尖刀&#xff0c;横扫展会全场&#xff0c;正…

互联网大厂Java求职面试实战:核心Java、微服务与AI技术全解析

互联网大厂Java求职面试实战&#xff1a;核心Java、微服务与AI技术全解析 本文通过模拟互联网大厂Java求职者谢飞机的面试故事&#xff0c;围绕电商场景展开&#xff0c;涵盖Java核心语言、微服务架构、数据库ORM、安全框架、缓存技术及AI应用&#xff0c;结合业务场景进行循序…

PHP性能优化10大高效技巧

优化代码结构 减少不必要的循环和条件判断&#xff0c;尽量使用内置函数替代自定义逻辑。避免在循环中执行数据库查询或复杂计算&#xff0c;将重复计算的结果缓存起来。使用适当的数据结构&#xff0c;如数组代替多个变量&#xff0c;提升数据访问效率。 使用OPcache 启用P…

运维系列【仅供参考】:前端测试工具详解

前端测试工具详解 前端测试工具详解 一、前端测试的分类 1. 单元测试(Unit Testing) 2. 集成测试(Integration Testing) 3. 端到端测试(End-to-End Testing,E2E) 4. 快照测试(Snapshot Testing) 5. 性能测试(Performance Testing) 二、主流前端测试工具详解 1. Jest…

北大Nature重磅!忆阻器芯片能效提升百倍、算力暴涨4倍

北京大学人工智能研究院陶耀宇研究员与集成电路学院杨玉超教授团队&#xff0c;近日在后摩尔时代计算架构领域取得重大突破。他们摒弃了传统芯片依靠晶体管逻辑门堆砌算力的老路&#xff0c;另辟蹊径&#xff0c;利用两种不同特性的忆阻器进行异质集成&#xff0c;构建了一套全…

曲靖市英语雅思培训辅导机构推荐:2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

在全球化留学热潮下,雅思考试已成为曲靖市学子开启海外求学之路的关键门槛,然而当地雅思考生普遍面临诸多困境:优质教育机构甄别困难、个性化提分方案缺失、备考技巧匮乏、留学衔接服务断层等。如何在繁杂的培训市场…

福州研究生留学中介口碑排名重磅出炉!性价比高机构深度揭秘 - 留学机构评审官

福州研究生留学中介口碑排名重磅出炉!性价比高机构深度揭秘一、福州学子如何甄别高性价比留学中介?2026年1月10日,对于计划深造的福州高校学子而言,选择一家可靠的研究生留学中介是申请路上的关键一步。许多同学面…

合肥硕士留学中介口碑排名揭晓!学员满意度高,服务优质受好评 - 留学机构评审官

合肥硕士留学中介口碑排名揭晓!学员满意度高,服务优质受好评一、合肥硕士留学中介如何选择?一份基于口碑的深度解析在搜索引擎中,“合肥硕士留学中介哪家好”、“合肥留学机构推荐”、“硕士申请服务评价”是本地学…

济南研究生留学中介:专注Top10院校申请,如何实现高录取率 - 留学机构评审官

济南研究生留学中介:专注Top10院校申请,如何实现高录取率一、济南学子如何甄选高录取率的Top10院校申请中介作为从业九年的国际教育规划师,我常被济南的学子及家长问及:在本地,哪些留学中介真正擅长冲击全球Top10…

【实战项目】 数据库读写分离性能优化

运行效果:https://lunwen.yeel.cn/view.php?id=5853 数据库读写分离性能优化摘要:随着互联网技术的飞速发展,数据库作为信息系统的核心组成部分,其读写分离技术已成为提高数据库性能的关键手段之一。本文针对数据…

10B超越Gemini-2.5-Pro!阶跃星辰端侧多模态天花板开源

阶跃星辰多模态智能团队刚刚开源了STEP3-VL-10B多模态模型。它仅有100亿参数&#xff0c;却在数学推理、视觉感知及复杂指令遵循等前沿能力上&#xff0c;不仅超越了同量级模型&#xff0c;更在多项基准测试中比肩甚至击败了参数量大其10至20倍的庞然大物&#xff0c;如GLM-4.6…

深度测评9个AI论文平台,专科生搞定毕业论文+格式规范!

深度测评9个AI论文平台&#xff0c;专科生搞定毕业论文格式规范&#xff01; AI工具助力论文写作&#xff0c;专科生也能轻松应对 随着人工智能技术的不断进步&#xff0c;越来越多的AI工具开始进入学术写作领域&#xff0c;为学生和研究者提供高效、便捷的支持。对于专科生来说…

未来工厂的建造者:国内顶尖整车制造数字化服务商深度盘点

在全球汽车产业加速迈向电动化、智能化的背景下&#xff0c;数字化制造已成为车企提升竞争力的核心手段。传统汽车制造依赖固化的流水线和经验驱动决策&#xff0c;难以满足市场对个性化定制、快速迭代与质量精益化的需求。而数字化制造通过集成物联网、人工智能与数字孪生等技…

搜索引擎排名内幕:前端也能撬动SEO流量密码

搜索引擎排名内幕&#xff1a;前端也能撬动SEO流量密码搜索引擎排名内幕&#xff1a;前端也能撬动SEO流量密码咱写前端的&#xff0c;凭啥不能抢 SEO 的饭碗&#xff1f;搜索引擎到底看啥&#xff1f;别被“算法”俩字吓尿内容质量与语义结构&#xff1a;别让爬虫看了一堆 div …

宁波研究生留学中介top10如何选?性价比高机构推荐 - 留学机构评审官

宁波研究生留学中介top10如何选?性价比高机构推荐作为一名从业八年的长三角地区研究生申请规划导师,我深知宁波的学子们在踏上留学之路时,面临的第一个关键选择往往是如何甄别一家靠谱的中介机构。大家普遍存在几个…

代码为刃 创意为甲,探索国产AI应用新路径 ——“算网杯”2025 AIGC开发者大赛圆满落幕

1月17日&#xff0c;“算网杯”2025 AIGC开发者大赛决赛在中国科学技术大学苏州高等研究院圆满落幕。本次大赛由中科算网算泥社区主办&#xff0c;中国科学技术大学苏州高等研究院、AIGC开放社区联合主办&#xff0c;并获得苏州市金融科技协会、苏州市人工智能行业协会等多家单…

上海硕士留学机构口碑排名发布,学员满意度高成关键评价标准 - 留学机构评审官

上海硕士留学机构口碑排名发布,学员满意度高成关键评价标准一、上海硕士留学机构如何选?学员口碑成破局关键大家好,我是从业九年的国际教育规划师李明。在协助众多学子规划海外深造路径的过程中,我发现,面对上海市…

AI自我进化了!仅靠消化自己生成的数据,能力翻倍增长

大模型通过反复训练自己生成的正确数据&#xff0c;在没有人工干预的情况下实现了规划能力的自我进化。这就好比一个学生不断做题&#xff0c;只保留对完答案后正确的解题过程作为复习资料&#xff0c;周而复始&#xff0c;最终在不需要老师教导的情况下学会了解决更复杂的难题…