_Linux系统编程—信号集操作函数
先来回顾一下未决信号集是怎么回事。
信号从产生到抵达目的地,叫作信号递达。而信号从产生到递达的中间状态,叫作信号的未决状态。产生未决状态的原因有可能是信号受到阻塞了,也就是信号屏蔽字(或称阻塞信号集,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
- SIG_BLOCK:当how设置为此值,set表示需要屏蔽的信号。相当于 mask = mask | set
- SIG_UNBLOCK:当how设置为此,set表示需要解除屏蔽的信号。相当于 mask = mask & ~set
- SIG_SETMASK:当how设置为此,set表示用于替代原始屏蔽及的新屏蔽集。相当于 mask = set若,调用sigprocmask解除了对当前若干个信号的阻塞,则在sigprocmask返回前,至少将其中一个信号递达。
我们如何读取未决信号集?系统提供了sigpending函数。
函数原型:
int sigpending(sigset_t *set);
参数说明:set传出参数。
返回值:
返回值:成功:0;失败:-1,设置errno
例:把所有常规信号的未决状态打印至屏幕。
#include #include #include void printPending(sigset_t *set) { int i = 0; for (i = 0; i < 32; i++) { if (sigismember(set, i) == 1) printf("1"); else printf("0"); } printf("\n"); } int main() { sigset_t set, oldset, pendset; sigemptyset(&set); sigaddset(&set, SIGQUIT); // ctrl + \ 将产生SIGQUIT信号 sigprocmask(SIG_BLOCK, &set, &oldset); while (1) { sigpending(&pendset); printPending(&pendset); // 写一个函数打印未决信号集 sleep(1); } }
本文授权转载自公众号「良许Linux」。良许,世界500强外企Linux开发工程师,公众号里分享大量Linux干货,欢迎关注!
【责任编辑:
赵宁宁
TEL:(010)68476606】
点赞 0
_Linux系统编程—信号集操作函数相关推荐
- Linux系统编程32:进程信号之详解信号集操作函数(sigset_t ,sigpending,sigprocmask)
文章目录 (1)sigset_t (2)信号集操作函数 (1)sigset_t 前面说过,未决和阻塞分别用位图来表示,于是我们把保存位图这样的数据类型称为sigset_t,sigset_t称为信号集, ...
- linux中signal函数返回值,signal函数、sigaction函数及信号集操作函数
信号是与一定的进程相联系的.也就是说一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如一个进程可以忽略某些信号而只处理其他一些信号另外一个进程还可以选择如何处理信号.总之这些总与特定的进程相联 ...
- 对信号集操作函数的使用方法和顺序
对信号集操作函数的使用方法和顺序如下: ① 使用signal或sigaction函数安装和登记信号的处理. ② 使用sigemptyset等定义信号集函数完成对信号集的定义. ③ ...
- 信号集操作函数,信号未决、阻塞、递达
转载:信号集操作函数,信号阻塞与未决 一,信号集及相关操作函数 信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } si ...
- linux的基础知识——signal信号捕捉,信号集操作函数
文章目录 1.signal捕捉信号 2.信号集操作函数 3.sigprocmask函数 4.sigpending函数 5.例子1:打印某个进程未决信号集 6.例子2:signal函数的注册捕捉执行函数 ...
- Day53 Linux setitimer函数 信号集操作函数 信号捕捉 SIGCHLD信号
目录 setitimer函数 信号集操作函数 1.信号集设定 2.igprocmask函数 3.sigpending函数 信号捕捉 1.signal函数 2.sigaction函数 SIGCHLD信号 ...
- 信号集操作函数,信号阻塞与未决
一,信号集及相关操作函数 信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } sigset_t 信号集用来描述信号的集合 ...
- Linux系统编程.NO7——目录操作函数
5. 目录文件管理函数 5.1. 目录文件概念 目录在Linux中也是文件,也有对应的文件指针,每次读目录之前也要先打开目录,然后目录指针就出现了,第一次读就是第一个文件的信息,然后第二次读就是第二个 ...
- linux 与信号集操作相关的函数
与信号集操作相关的函数 #include <signal.h> 清空信号集 全都为0 int sigemptyset(sigset_t *set);填充信号集 全都为1 int sigfi ...
最新文章
- 网络流媒体协议 RTSP协议
- 向net core 3.0进击——Swagger的改变
- 2015.8.3 Java
- 阿里云创客+千人创投会 无人机项目夺冠
- Android 显式意图(Intent) 与 隐式意图
- java 中阶乘如何表示_Java阶乘实例
- PreScan传感器(零)——通用配置
- MAC下的环境变量设置
- coreldraw做生化标志_CorelDRAW标志绘制图文教程,logo设计制作教程
- 最小费用流算法不完全指南-2017华为软件精英挑战赛
- html中去除浮漂有什么作用,浮漂的1、2、3号都有什么作用?
- 时间字符串解析(格式问题如2020-04-25T07:00:00+00:00)
- 超实用移动固态硬盘,Lexar雷克沙SL100 Pro
- 数据到底能做什么? ——谷歌、腾讯、高德告诉你答案
- 云计算浅谈之二:云计算介绍(2)
- zencart忘记后台密码的解决办法
- 新手站长说说之织梦DedeCMS列表页标题SEO优化
- 【MQ】 解决MQ 2035-MQRC_NOT_AUTHORIZED
- java歌唱比赛冠亚军_歌手历届冠军盘点 这是一档歌唱竞演类真人秀节目
- c语言健康状况检查系统设计,智能健康监护仪设计(含电路原理图)
热门文章
- python装饰器实现对异常代码出现进行监控
- 3分钟教你用python制作一个简单词云
- Django中自定义实现RESTful API
- linux 进程间通信 dbus-glib【实例】详解二(上) 消息和消息总线(附代码)
- web前端入门学习 html5(1)
- python namedtuple (命名元组)用法详解
- Intel Realsense D435 Realsense View 错误 RT IC2 Config error
- python matplotlib二维平面等高线的绘制, plt.contour 与 plt.contourf, plt.clabel和plt.colorbar, plt.xticks([])
- python——while 语句
- docker设置国内镜像源