通俗易懂说信号(2)信号集及操作


通俗易懂说信号(1)信号
https://blog.csdn.net/lqy971966/article/details/88938079
通俗易懂说信号(2)信号集及操作
https://blog.csdn.net/lqy971966/article/details/103176646
通俗易懂说信号(3)signalfd
https://blog.csdn.net/lqy971966/article/details/103531513
通俗易懂说信号(4)Linux信号列表及其详解
https://blog.csdn.net/lqy971966/article/details/106714752
通俗易懂说信号(5)sigprocmask
https://blog.csdn.net/lqy971966/article/details/117919696

1. linux进程对信号的处理过程

  1. 信号源产生信号,由内核向进程发送信号;
  2. 进程选择是否阻塞还是处理,阻塞则信号进入阻塞信号列表,只有当解除阻塞后,进程才接收该信号,若一直不接收,内核则将该信号从阻塞列表中移除并丢弃;
  3. 若不阻塞,则进程接收信号;
  4. 进程接收信号后,进程可屏蔽该信号,或者执行用户编写的处理函数,或者执行默认动作;

进程信号处理,请看第一篇文章《通俗易懂说信号》,通过signal 和 sigaction 函数进行信号处理。
通俗易懂说信号
https://blog.csdn.net/lqy971966/article/details/88938079

2. 信号集

  1. 信号集: 顾名思义,就是信号的集合。
    在linux中,它的类型是sigset_t,大小是64bits。
  2. 原因: 因为目前linux流行版本一共有64个信号(不同版本信号格式不同),我们一个bit来表示一种信号,一共只需要64bits就行

3.信号集操作函数

头文件 signal.h 提供了下列五个处理信号集的函数

3.信号集操作函数
头文件 signal.h 提供了下列五个处理信号集的函数

1. sigemptyset 初始化set所指向的信号集,清除里面所有已经注册的信号,即将所有位置0
int sigemptyset(sigset_t *set);
返回值:若成功则返回0,若出错则返回-1

2. sigfillset  将信号集初始化为包含所有的已定义的信号。标志位全部置1。
初始化由 set 指向的信号集,使其包含所有信号。即将所有位置1
int sigfillset(sigset_t *set);
返回值:若成功则返回0,若出错则返回-1

4. sigaddset 将一个信号 signo 添加到现有信号集 set 中。即将该信号对应的位置1
int sigaddset(sigset_t *set, int signo);
返回值:若成功则返回0,若出错则返回-1

5. sigdelset 将一个信号 signo 从信号集 set 中删除。即将该信号对应的位置0
int sigdelset(sigset_t *set, int signo);
返回值:若成功则返回0,若出错则返回-1

6. sigismember 判断指定信号 signo 是否在信号集 set 中。
int sigismember(const sigset_t *set, int signo);
返回值:若真则返回1,若假则返回0,若出错则返回-1

4. sigprocmask

sigprocmask && 设置进程的信号屏蔽字
sigprocmask 函数可以检测或者设置进程的信号屏蔽字。

#include <signal.h>
int sigprocmask(int how, const sigset_t * set, sigset_t * oset);

返回值:

若成功则返回0,若出错则返回-1

参数说明

**set**:如果set是非空指针,则更改进程的信号屏蔽字
**oset**:如果oset是非空指针,则读取进程的当前信号屏蔽字通过oset参数传出
**how**:参数how指示如何更改
**注意**:如果set为空,那how参数显然也没有意义啦,信号集都没有,我哪知道要改哪个信号的屏蔽状态字!!!

how的取值:

SIG_BLOCK 把参数set中的信号添加到信号屏蔽字中
SIG_SETMASK 把信号屏蔽字设置为参数set中的信号
SIG_UNBLOCK 从信号屏蔽字中删除参数set中的信号

代码例子:

sigset_t bset; //用来设置阻塞的信号集
sigemptyset(&bset); //清空信号集
sigaddset(&bset, SIG_INT); //将SIG_INT信号添加到信号集中
sigprocmask(SIG_BLOCK, &bset, NULL); //阻塞SIG_INT信号

详细例子参考我的博客:
通俗易懂说信号(5)sigprocmask
https://blog.csdn.net/lqy971966/article/details/117919696

参考

[1]:https://blog.csdn.net/weixin_38190650/article/details/78077616
[2]:https://blog.csdn.net/ljianhui/article/details/10130539

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值