先来回顾一下未决信号集是怎么回事。

信号从产生到抵达目的地,叫作信号递达。而信号从产生到递达的中间状态,叫作信号的未决状态。产生未决状态的原因有可能是信号受到阻塞了,也就是信号屏蔽字(或称阻塞信号集,mask)对应位被置1。阻塞信号集和未决信号集均是由内核维护的,整个过程如下图示:

我们有时需要屏蔽某个信号,就需要去修改阻塞信号集。那么,我们该如何修改阻塞信号集?系统提供的一个方法是,我们先创建一个跟阻塞信号集一样的集合,再利用它去修改阻塞信号集。

系统提供了一系列的信号集设定函数。这些函数如下所示:

sigset_t  set;

信号集数据类型,本质是typedef unsigned long sigset_t; 

int sigemptyset(sigset_t *set);

将某个信号集清0

int sigfillset(sigset_t *set);

将某个信号集置1

int sigaddset(sigset_t *set, int signum);

将某个信号加入信号集

int sigdelset(sigset_t *set, int signum);

将某个信号清出信号集

以上几个函数返回值均是:成功:0;失败:-1

int sigismember(const sigset_t *set, int signum);

判断某个信号是否在信号集中

返回值:在集合:1;不在:0;出错:-1

使用以上这些函数创建完信号集后,要如何去改变阻塞信号集呢?系统又提供了一个函数:sigprocmask函数

sigprocmask函数可以用来屏蔽信号,也可以用来解除屏蔽信号,其本质就是利用我们创建的信号集去改变阻塞信号集。

函数原型:

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

返回值:

成功:0;失败:-1,设置errno

参数解释:

set:传入参数,是一个位图,set中哪位置1,就表示当前进程屏蔽哪个信号。

oldset:传出参数,保存旧的信号屏蔽集。这个与setitimer有点相似。

how参数取值:

假设当前的信号屏蔽字为mask

1.SIG_BLOCK:当how设置为此值,set表示需要屏蔽的信号。相当于 mask = mask | set

2.SIG_UNBLOCK:当how设置为此,set表示需要解除屏蔽的信号。相当于 mask = mask & ~set

3.SIG_SETMASK:当how设置为此,set表示用于替代原始屏蔽及的新屏蔽集。相当于 mask = set若,调用sigprocmask解除了对当前若干个信号的阻塞,则在sigprocmask返回前,至少将其中一个信号递达。

我们如何读取未决信号集?系统提供了sigpending函数

函数原型:

int sigpending(sigset_t *set);

参数说明:

set传出参数。

返回值:

返回值:成功:0;失败:-1,设置errno

例:把所有常规信号的未决状态打印至屏幕。

 1#include
2#include
3#include
4
5void printPending(sigset_t *set)
6{
7 int i = 0;
8
9 for (i = 0; i < 32; i++) {
10 if (sigismember(set, i) == 1)
11 printf("1");
12 else
13 printf("0");
14 }
15 printf("\n");
16}
17
18int main()
19{
20 sigset_t set, oldset, pendset;
21 sigemptyset(&set);
22 sigaddset(&set, SIGQUIT); // ctrl + \ 将产生SIGQUIT信号
23 sigprocmask(SIG_BLOCK, &set, &oldset);
24 while (1) {
25 sigpending(&pendset);
26 printPending(&pendset); // 写一个函数打印未决信号集
27 sleep(1);
28 }
29}

公众号:良许Linux

有收获?希望老铁们来个三连击,给更多的人看到这篇文章

Linux系统编程—信号集操作函数的更多相关文章

  1. Linux系统编程——信号

    目录 信号的介绍 信号的机制 信号的编号 Linux常规信号一览表 信号的产生 终端按键产生信号 硬件异常产生信号 kill函数/命令产生信号 信号的操作函数 信号集设定 sigprocmask函数 ...

  2. linux系统编程--信号

    信号的概念 man 7 siganl  查看man手册 信号在我们的生活中随处可见, 如:古代战争中摔杯为号:现代战争中的信号弹:体育比赛中使用的信号枪......他们都有共性:1. 简单 2. 不能 ...

  3. linux系统编程之信号(五):信号集操作函数,信号阻塞与未决

    一,信号集及相关操作函数 信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } sigset_t 信号集用来描述信号的集合 ...

  4. Linux系统编程--文件IO操作

    Linux思想即,Linux系统下一切皆文件. 一.对文件操作的几个函数 1.打开文件open函数 int open(const char *path, int oflags); int open(c ...

  5. Linux系统编程—信号捕捉

    前面我们学习了信号产生的几种方式,而对于信号的处理有如下几种方式: 默认处理方式: 忽略: 捕捉. 信号的捕捉,说白了就是抓到一个信号后,执行我们指定的函数,或者执行我们指定的动作.下面详细介绍两个信 ...

  6. Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号

    Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号 背景 上一讲我们介绍了Unix IPC中的2种管道. 回顾一下上一讲的介绍,IPC的方式通常有: Unix IPC包括:管道 ...

  7. Linux系统编程(23)——信号的阻塞

    实际执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending).进程可以选择阻塞(Block)某个信号.被阻塞的信号产生时将保持在未决状态,直到进程 ...

  8. linux系统编程之信号(四)

    今天继续探讨信号相关的东东,话不多说,正入正题: 信号在内核中的表示: 下面用图来进一步描述这种信号从产生到递达之间的状态(信号阻塞与未诀):   那是怎么来决定的呢?下面慢慢来举例分解: 所以,通过 ...

  9. Linux系统编程之----》信号

    "===信号========================================================================================= ...

随机推荐

  1. 蒲公英 · JELLY技术周刊 Vol.20: Vue3 极致优化——分析 Vue3 Compiler 告诉你为什么这么快

    蒲公英 · JELLY技术周刊 Vol.20 性能优化是一条无尽的路,我们总是可以找到各种途径去提升体验,不论是响应时间还是按需加载,亦或是根据框架或者组件有针对性的优化都会是不错的方法.如果你在使用 ...

  2. android MVVM(1)用LiveData关联VM 与 V

    1.官方文档 MVVM 官方文档: https://developer.android.com/jetpack/docs/guide ViewModel 文档: https://developer.a ...

  3. 总结回顾js arr的常见方法以及相关的使用场景(一)

    Array对象方法 1.arr.concat() 连接两个或更多的数组,并返回结果. 连接数组中的值 连接两个数组 连接三个数组 2.arr.join() 把数组的所有元素放入一个字符串.元素通过指定 ...

  4. 【学习中】Fitness Schedule

    章节 内容 签到 第1周:步伐 √第1课(34分钟) 跑步1分钟 行走2分钟 共做8次 4月24日 √第2课(28分钟) 跑步1分钟 行走2分钟 共做6次 4月27日 √第3课(31分钟) 跑步1分钟 ...

  5. google protocol buffer——protobuf的问题及改进一

    这一系列文章主要是对protocol buffer这种编码格式的使用方式.特点.使用技巧进行说明,并在原生protobuf的基础上进行扩展和优化,使得它能更好地为我们服务. 在上一篇文章中,我们完整了 ...

  6. 自定义注解-方法重试@RetryProcess

    背景 在项目开发中,有时候会出现接口调用失败,本身调用又是异步的,如果是因为一些网络问题请求超时,总想可以重试几次把任务处理掉. 一些RPC框架,比如dubbo都是有重试机制的,但是并不是每一个项目多 ...

  7. 20190925-02配置redis服务在后台启动 000 023

    多端口要加 -p 可以进入指定端口

  8. vue.js 的安装

    包含vue的脚手架的安装. 1,到项目目录下输入 cnpm i -g vue-cli 2,安装完毕后咱们看看.输入 vue 即可看到vue的安装情况. 3,输入 vue list 即可看到框架的选择 ...

  9. [LeetCode]69. x 的平方根(数学,二分)

    题目 https://leetcode-cn.com/problems/sqrtx 题解 方法一:牛顿迭代法 按点斜式求出直线方程(即过点Xn,f(Xn)),然后求出直线与x轴交点,即为Xn+1: 求 ...

  10. NoSuchMethodError: org.springframework.beans.factory.config.BeanDefinition.getResolvableType

    spring整合Mybatis报错: 解决方法: 检查maven依赖中的spring-jdbc和spring-webmvc是否版本一致 以下均为5.2.0.RELEASE版本 除此之外再检查是否有其他 ...