信号集的操作

信号(六)信号集操作函数 一、内核通过读取未决信号集来判断信号是否应该被处理。信号屏蔽字mask可以影响未决信号集。为我们可以在应用程序中自定义set来改变mask,来达到屏蔽指定信号的目的。二、信号集设定:sigset_t set;//typedef unsigned long sigset_t; int sigemptyset(sigset_t *set); //将某个信号集清零 int sigfillset(... 阅读详情

信号集的初始操作

信号集 : 能够表示多个信号的数据类型

  1. #include <signal.h>
  2. // 以下函数, 成功, 返回 0; 失败, 返回 -1.
  3. int sigemptyset(sigset_t *set) // 清除信号集中的所以信号
  4. int sigfillset(sigset_t *set) // 初始化set信号集中的信号, 并把所有该程序的信号加入到信号集中
  5. int sigaddset(sigset_t *set, int signo) // 添加signo信号到信号集中
  6. int sigdelset(sigset_t *set, int signo) // 信号集中删除signo信号
  7. // 成功,返回 1; 失败, 返回 0.
  8. int sigismember(const sigset_t *set, int signo) // 测试一个指定的位

在所有应用程序使用信号集之前, 要对信号集调用sigemptyset和sigfillset一次.


sigprocmask 函数

  1. #include <signal.h>
  2. int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset)
  3. // 成功, 返回 0; 失败, 返回 -1.

关于sigpromask()函数的各个参数的取值对函数功能的影响很重要, 这个函数也是signal信号集很重要的一部分.

how可设置的参数为:SIG_BLOCK, SIG_UNBLOCK,SIG_SETMASK

SIG_BLOCK :按照参数 set 提供的屏蔽字,屏蔽信号。并将原信号屏蔽保存到oldset中。
SIG_UNBLOCK :按照参数 set 提供的屏蔽字进行信号的解除屏蔽。针对set中的信号进行解屏。
SIG_SETMASK : 按照参数 set 提供的信号设置重新设置系统信号。即, 该进程新的屏蔽字是 set 的值。

关于常见的sigprocmask()函数的操作

  1. sigprocmask(SIG_BLOCK, set, NULL)
    • 屏蔽set中保存的信号
    • 可更新程序的信号集
  2. sigprocmask(SIG_UNBLOCK, set, NULL)
    • 当前的程序中set中包含的信号全部取消屏蔽
  3. sigprocmask(SIG_SETMASK, set, NULL)
    • 程序的屏蔽字为set信号集中包含的信号
    • 可更新程序的信号集
  1. /*************************************************************************
  2. > File Name: t.cpp
  3. > Author: Function_Dou
  4. > Mail:
  5. > Created Time: 2018年02月03日 星期六 17时58分22秒
  6. ************************************************************************/
  7. #include <stdio.h>
  8. #include <signal.h>
  9. #include "apue.h"
  10. void checkset(int i);
  11. int main()
  12. {
  13. sigset_t blockset;
  14. sigemptyset(&blockset);
  15. // 添加两个信号进入信号集中
  16. sigaddset(&blockset,SIGINT);
  17. sigaddset(&blockset,SIGTSTP);
  18. // 测试信号集中由SIGINT信号了
  19. if(sigismember(&blockset,SIGINT))
  20. printf("SIGINT\n\n");
  21. // 没有信号输出是因为当前的信号集还是NULL(空的)
  22. checkset(0);
  23. // 将blockset信号集变为当前程序的信号集
  24. sigprocmask(SIG_SETMASK, &blockset,NULL);
  25. if(sigismember(&blockset,SIGINT))
  26. printf("SIGINT\n\n");
  27. // 现在的信号集不再为NULL了.
  28. checkset(1);
  29. sigaddset(&blockset,SIGTERM);
  30. // sigprocmask(SIG_SETMASK, &blockset,NULL);
  31. // 此时的SIG_BLOCK意义跟SIG_SETMASK意义一样, 都是更新当前blockset信号集:
  32. sigprocmask(SIG_BLOCK,&blockset,NULL);
  33. checkset(2);
  34. // SIG_UNBLOCK 将blockset 信号集全部取消屏蔽. 也就是程序取消了对信号集的屏蔽了, 但是blockset中的信号还是存在的.
  35. sigprocmask(SIG_UNBLOCK,&blockset,NULL);
  36. if(sigismember(&blockset,SIGTERM))
  37. printf("SIGTERM\n");
  38. if(sigismember(&blockset,SIGINT))
  39. printf("SIGINT\n");
  40. if(sigismember(&blockset,SIGTSTP))
  41. printf("SIGSTP\n\n");
  42. // 检测到程序中的信号屏蔽已经没有了.
  43. checkset(3);
  44. if(sigismember(&blockset,SIGTERM))
  45. printf("SIGTERM\n");
  46. if(sigismember(&blockset,SIGINT))
  47. printf("SIGINT\n");
  48. if(sigismember(&blockset,SIGTSTP))
  49. printf("SIGTSTP\n");
  50. checkset(4);
  51. }
  52. void checkset(int i)
  53. {
  54. sigset_t set;
  55. printf("check set start:%d\n", i);
  56. if(sigprocmask(SIG_SETMASK, NULL, &set) < -1)
  57. {
  58. printf("check set sig procmask error!!\n");
  59. exit(0);
  60. }
  61. if(sigismember(&set,SIGINT))
  62. printf("SIGINT\n");
  63. if(sigismember(&set,SIGTSTP))
  64. printf("SIGTSTP\n");
  65. if(sigismember(&set,SIGTERM))
  66. printf("SIGTERM\n");
  67. printf("check set end\n\n");
  68. }

运行结果

  1. [root@localhost Signal]# ./a.out
  2. SIGINT
  3. check set start:0
  4. check set end
  5. SIGINT
  6. check set start:1
  7. SIGINT
  8. SIGTSTP
  9. check set end
  10. check set start:2
  11. SIGINT
  12. SIGTSTP
  13. SIGTERM
  14. check set end
  15. SIGTERM
  16. SIGINT
  17. SIGSTP
  18. check set start:3
  19. check set end
  20. SIGTERM
  21. SIGINT
  22. SIGTSTP
  23. check set start:4
  24. check set end

关于sigprocmask()函数理解, 在此我还写了一个更简单的程序, 方便理解程序中的屏蔽信号

  1. /*************************************************************************
  2. > File Name: z.cpp
  3. > Author: Function_Dou
  4. > Mail:
  5. > Created Time: 2018年02月03日 星期六 22时55分58秒
  6. ************************************************************************/
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <signal.h>
  10. static void Fun(sigset_t sigset)
  11. {
  12. if(sigismember(&sigset, SIGSEGV))
  13. printf("SIGEGV\n");
  14. if(sigismember(&sigset, SIGINT))
  15. printf("SIGINT\n");
  16. if(sigismember(&sigset, SIGTERM))
  17. printf("SIGTERM\n");
  18. if(sigismember(&sigset, SIGALRM))
  19. printf("SIGALRM\n");
  20. }
  21. int main()
  22. {
  23. sigset_t new_sigset, old_sigset;
  24. sigemptyset(&new_sigset);
  25. sigemptyset(&old_sigset);
  26. sigaddset(&new_sigset, SIGSEGV);
  27. sigaddset(&new_sigset, SIGINT);
  28. sigaddset(&new_sigset, SIGTERM);
  29. printf("1 new_sigset\n");
  30. Fun(new_sigset);
  31. printf("\n\n");
  32. sigprocmask(SIG_BLOCK, &new_sigset, &old_sigset);
  33. printf("2 old_sigset\n");
  34. Fun(old_sigset);
  35. printf("\n\n");
  36. printf("3 new_sigset\n");
  37. Fun(new_sigset);
  38. printf("\n\n");
  39. // sigaddset(&old_sigset, SIGALRM);
  40. sigaddset(&new_sigset, SIGALRM);
  41. sigprocmask(SIG_BLOCK, &new_sigset, &old_sigset);
  42. printf("4 old_sigset\n");
  43. Fun(old_sigset);
  44. printf("\n\n");
  45. printf("5 new_sigset\n");
  46. Fun(new_sigset);
  47. printf("\n\n");
  48. // 取消new_sigset中的信号屏蔽, 此时程序的信号集为NULL
  49. sigprocmask(SIG_UNBLOCK, &new_sigset, &old_sigset);
  50. printf("6 old_sigset\n");
  51. Fun(old_sigset);
  52. printf("\n\n");
  53. printf("7 new_sigset\n");
  54. Fun(new_sigset);
  55. printf("\n\n");
  56. // 这里old_sigset信号集中的信号为NULL, 因为上次程序的屏蔽字为NULL
  57. sigprocmask(SIG_SETMASK, &new_sigset, &old_sigset);
  58. printf("8 old_sigset\n");
  59. Fun(old_sigset);
  60. printf("\n\n");
  61. printf("9 new_sigset\n");
  62. Fun(new_sigset);
  63. printf("\n\n");
  64. exit(0);
  65. }

运行结果

  1. [root@localhost Signal]# ./a.out
  2. 1 new_sigset
  3. SIGEGV
  4. SIGINT
  5. SIGTERM
  6. 2 old_sigset
  7. 3 new_sigset
  8. SIGEGV
  9. SIGINT
  10. SIGTERM
  11. 4 old_sigset
  12. SIGEGV
  13. SIGINT
  14. SIGTERM
  15. 5 new_sigset
  16. SIGEGV
  17. SIGINT
  18. SIGTERM
  19. SIGALRM
  20. 6 old_sigset
  21. SIGEGV
  22. SIGINT
  23. SIGTERM
  24. SIGALRM
  25. 7 new_sigset
  26. SIGEGV
  27. SIGINT
  28. SIGTERM
  29. SIGALRM
  30. 8 old_sigset
  31. 9 new_sigset
  32. SIGEGV
  33. SIGINT
  34. SIGTERM
  35. SIGALRM

写了这么多的代码, 就是为了方便理解sigprocmask()函数各个参数的意义, 以及基础的运用.
希望对你有所帮助!

【linux】信号集操作函数 信号捕捉 信号集操作函数 信号捕捉 阅读详情

相关推荐

信号集

一:信号集 一个进程,必须能够记住这个进程当前阻塞了哪些信号。 000000000000000000000 我们需要 “信号集 ”的这么一种数据类型(结构),能够把这60多个信号都表示下(都装下)。 0000000000,0000000000,0000000000,00,0000000000,0000000000,0000000000,00 (64个二进制位) linux 是用sigset_t结构类型来表示信号集的; typedef struct{ unsigned long sig[2]; }

qq_38158479的博客 564

函数简介篇——信号集

说明:   本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。   QQ 群 号:513683159 【相互学习】 内容来源:    信号集 信号集类型 sigset_t 相关函数【man sigemptyset】 (一)sigemptyset()   1.函数功能:将一个信号集的内容清空 项目 说明 函数原型 int sigemptyset(sigset_t *set); 头文件 signal.h

weixin_42645653的博客 958

告别Link180!在Ansys Mechanical 2020R2中正确启用Cable280绳索单元(附Beta选项开启指南)

本文详细介绍了在Ansys Mechanical 2020R2中启用Cable280绳索单元的全过程,包括Beta选项的开启步骤、建模技巧及高阶应用。Cable280作为专为绳索仿真设计的单元,相比传统的Link180单元,在大变形模拟和计算效率上表现更优,特别适合斜拉桥、电梯牵引绳等工程场景。

weixin_33711647的博客 405

一文搞懂「信号」和「信号集」

文章目录信号是啥信号相关函数killraiseabortalarmsetitimersignal信号集信号集相关函数sigemptysetsigfillsetsigaddsetsigdelsetsigismembersigprocmasksigpendingsigactionSIGCHLD 信号 信号是啥 信号是 Linux 进程间通信的最古老的方式之一,是事件发生时对进程的通知机制,有时也称之为软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信的方式。信号可以导致一个正在运行的进程被另一个正在

阿东的学习记录 4276

【GEE实战】Sen+MK趋势分析:从代码到地图,解锁植被变化时空密码

本文详细介绍了在Google Earth Engine(GEE)平台上使用Sen斜率估计和Mann-Kendall(MK)检验进行植被变化趋势分析的全流程。从遥感数据加载、Sen斜率计算到MK显著性检验,结合代码示例和实战经验,帮助读者掌握植被时空变化分析的实用技巧,为生态监测和环境保护提供数据支持。

weixin_42628688的博客 213

Label Studio + SAM2分割半自动标注与yolo11训练

Label Studio + SAM2分割半自动标注与yolo11训练

schFallingCloud 1408

信号集的使用

信号集: 一堆信号的集合,如果想同时设置多个信号的属性,可以先把信号加入到信号集中,再设置信号集的属性。 阻塞掩码: 一个属性,当把某些信号加入到信号集,如果设置了信号集为阻塞状态,那么在阻塞状态下,如果收到信号集中的信号,则暂时不会响应,直到阻塞状态消失了,才会响应! 函数接口: 关于信号集的接口: sigemptyset, sigfillset, sigaddset, sigdelset, sigismember - POSIX signal set operations. #include.

weixin_48256350的博客 504

audio框架学习-Audio_Flinger分析

文章目录一、代码位置二、audio服务启动2.1 main服务2.2 audioflinger添加到系统服务中2.3 audioflinger的对外接口 之前记录过audioTrack的笔记,这次继续参考audioFlinger相关的代码并做笔记; 参考文档:https://www.cnblogs.com/innost/archive/2011/01/15/1936425.html和https://blog.youkuaiyun.com/zyuanyun/article/details/60890534?spm=100

永不秃头的程序员的博客 2135

信号集(未决信号集,阻塞信号集)

未决信号集和阻塞信号集的关系 阻塞信号集是当前进程要阻塞的信号的集合,未决信号集是当前进程中还处于未决状态的信号的集合,这两个集合存储在内核的PCB中。 下面以SIGINT为例说明信号未决信号集和阻塞信号集的关系: 当进程收到一个SIGINT信号(信号编号为2),首先这个信号会保存在未决信号集合中,此时对应的2号编号的这个位置上置为1,表示处于未决状态;在这个信号需要被处理之前首先要在阻塞信号集中的编号为2的位置上去检查该值是否为1: ...

m0_60663280的博客 2868

(功能安全六)硬件FMEDA计算

FMEDA(故障模式、影响与诊断分析)是功能安全验证的核心方法,通过量化分析硬件故障模式及其影响,计算SPFM、LFM、PMHF等关键指标。分析过程包含六大步骤:计算元器件失效率、识别故障模式、评估安全机制诊断覆盖率、分类计算各类失效率、量化指标计算及设计优化。输入需要系统架构图、硬件故障模式清单等资料,输出安全指标达标情况及改进建议,确保设计满足ASIL等级要求。该方法通过系统化的故障分类和量化评估,为硬件安全设计提供科学依据。

Dayongger的博客 1451

2024美团秋招硬件开发笔试真题及答案解析

在 Linux 内核的网络设备驱动中,数据链路层的功能通常由网络协议栈的低层(如以太网驱动)实现,而不是作为网络设备驱动的一个独立层次。在 FreeRTOS 中,任务通知(Task Notifications)是一种轻量级的事件传递机制,用于在任务之间或任务与中断之间传递信号。小美正在开发一个简单的密码生成器,其中一个功能是将输入的字符串中的所有字母按字母顺序循环前移一位(即 'a' 变为 'z','B' 变为 'A',以此类推)。它包含了网络设备的各种参数和方法,用于管理网络设备的初始化、配置和操作。

XU157303764的博客 1676

【Linux】信号集及信号集操作函数

【Linux】信号集及信号集操作函数

m0_62714628的博客 1017

[HQChart教程] 去掉“仅学习使用”文字提示的小技巧

最近用 HQChart 做图表时,发现左下角有“仅学习使用”的字样。这种水印虽然是默认的,但如果要展示给客户,可能会显得不够专业。还好,这个问题很好解决,只需要简单修改一下配置。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 598

【进程信号】五、信号集操作接口详解

❓❓❓​ 答案肯定还是。

lirendada的博客 1253

ROSTCM6+Gephi的网络语义分析详细教程(附案例实战)

ROSTCM6是武汉大学沈阳教授研发编码的国内目前唯一的以辅助人文社会科学研究的大型免费社会计算平台。该软件可以实现微博分析、聊天分析、全网分析、网站分析、浏览分析、分词、词频统计、英文词频统计、流量分析、聚类分析等一系列文本分析。Gephi是一款开源免费跨平台基于JVM的复杂网络分析软件,可用于各种图形和网络的可视化和探索,是最受欢迎的网络可视化软件之一。

m0_64336780的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

掌握Linux信号集操作技巧

摘要:Linux信号集(sigset_t)是用于管理进程信号响应的位掩码集合,需通过标准函数操作。核心函数包括:sigemptyset(清空)、sigfillset(填充)、sigaddset(添加信号)、sigdelset(删除信号)和sigismember(检查信号存在)。这些函数需与sigprocmask配合使用,通过SIG_BLOCK/SIG_UNBLOCK控制信号阻塞状态。典型应用包括:初始化信号集、修改进程信号屏蔽字、实现信号处理期间的竞态防护等。

弘羽 1083

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

信号集操作函数

set:指向 sigset_t 类型的信号集,该信号集包含了要操作的信号。若 set 为 NULL,则不改变当前的信号屏蔽字,仅把当前的信号屏蔽字保存到 oldset 中。oldset:指向 sigset_t 类型的信号集,用于保存调用 sigprocmask 之前的信号屏蔽字。SIG_UNBLOCK:从当前的信号屏蔽字中移除 set 所指向的信号集中的信号,也就是解除对这些信号的阻塞。SIG_BLOCK:把 set 所指向的信号集中的信号添加到当前的信号屏蔽字里,即阻塞这些信号。

2301_80657297的博客 916

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Linux:信号集操作函数及其使用

信号集操作函数及其使用 信号集操作函数 类型sigset_t 从上面的图来看,每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次,阻塞标志也是这样表示的。 因此,未决和阻塞标志可以用相同的数据类型sigset_t来存储,sigset_t称为信号集,这个类型可以表示每个信号的“有效”或“无效”状态,在阻塞信号集中“有效”和“无效”的含义是该信号是否被阻塞,而在未决信号集中“有效”和...

ETalien_的博客 1492

【Linux】信号的处理以及信号集操作函数

首先来再次看看这张图: sigset_t 从上图来看,每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次,阻塞标志也是这样表示的。因此,未决和阻塞标志可以用相同的数据类型sigset_t来存储,sigset_t称为信号集,这个类型可以表示每个信号的“有效”或“无效”状态,在阻塞信号集中“有效”和“无效”的含义是该信号是否被阻塞,而在未决信号集中“有效”和“无效”的含义是该...

Miss_Monster的博客 644

Linux信号集操作函数详解

本文详细介绍了Linux系统中的信号集操作函数。信号集(sigset_t)是一种位掩码数据结构,用于管理多个信号。主要内容包括:1)信号集初始化、添加/删除信号等基本操作;2)进程信号掩码操作(sigprocmask)和挂起信号检查;3)高级功能如信号等待(sigsuspend)和多线程处理(pthread_sigmask);4)实际应用场景如临界区保护和信号等待实现。文章还强调了使用注意事项,如信号编号范围、原子操作和线程安全等问题。这些函数为Linux信号处理提供了灵活可靠的工具集,对开发健壮的应用程序

软件科学-郝学胜 833

【Linux信号专题】三、未决信号集、阻塞信号集与信号集操作函数

本文为Linux信号专题之未决信号集、阻塞信号集相关。系统学习Linux开发、VIM/GCC/GDB/Make工具、Linux文件IO、进程管理、进程通信、多线程等,请关注专栏《Linux从小白到大神》免费学习。

仅以此博客记录日常学习工作中所思所得,水平有限,难登大雅,万望海涵。 1142

信号与多线程(三)——信号集操作函数和信号捕捉

信号集操作函数和信号捕捉

weixin_73141818的博客 967

操作系统信号集与信号屏蔽

是一种专门用于存储多个信号的数据类型sigset_t该类型占128字节,每个字节代表了一种信号的有或无。

zzt_is_me的博客 828

【Linux操作系统】深入探索Linux系统编程中的信号集操作函数

在Linux系统编程中,信号集操作函数是非常重要的工具,它们允许我们对信号进行管理和控制。本篇博客将详细介绍Linux系统编程中的信号集操作函数,包括信号集的创建、添加和删除信号,以及对信号集进行操作的常用函数。通过深入了解这些函数,我们将能够更好地理解和应用Linux系统编程中的信号处理机制。

Goforyouqp的博客 6208

linux信号集操作函数

信号集操作函数 内核通过读取未决信号集来判断信号是否应被处理。信号屏蔽字mask可以影响未决信号集。而我们可以在应用程序中自定义set来改变mask。已达到屏蔽指定信号的目的。 信号集设定 sigset_t  set; // typedef unsigned long sigset_t; int sigemptyset(sigset_t *set); 将某个信号集清0   成功:0;失

oguro的博客 1002
上一篇: 关于SIGHCLD和SIGCLD
下一篇: alarm闹钟
Function_18
博客等级 码龄10年 193粉丝 239原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值