通俗易懂说信号(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进程对信号的处理过程
- 信号源产生信号,由内核向进程发送信号;
- 进程选择是否阻塞还是处理,阻塞则信号进入阻塞信号列表,只有当解除阻塞后,进程才接收该信号,若一直不接收,内核则将该信号从阻塞列表中移除并丢弃;
- 若不阻塞,则进程接收信号;
- 进程接收信号后,进程可屏蔽该信号,或者执行用户编写的处理函数,或者执行默认动作;
进程信号处理,请看第一篇文章《通俗易懂说信号》,通过signal 和 sigaction 函数进行信号处理。
通俗易懂说信号
https://blog.csdn.net/lqy971966/article/details/88938079
2. 信号集
- 信号集: 顾名思义,就是信号的集合。
在linux中,它的类型是sigset_t,大小是64bits。 - 原因: 因为目前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