一、自定义信号集
(1)类型:sigset_t (本质是位图)
(2)设置自定义信号集方法:
sigset_t set; //创建一个自定义信号集
sigemptyset(&set); //创建后,默认是随机数,所以跟着置空
func(&set); //设置自定义信号集(func 详见下 5 个函数)
(3)设置自定义信号集函数:5 个
int sigemptyset(sigset_t *set); // 将自定义信号集置空(置 0)// 不阻塞任何信号
int sigfillset(sigset_t *set); // 将自定义信号集置 1 // 阻塞所有信号
int sigaddset(sigset_t *set, int signum); // 将某个信号在自定义信号集置 1
int sigdelset(sigset_t *set, int signum); // 将某个信号在自定义信号集置 0
int sigismember(const sigset_t *set, int signum); // 判断某个信号在集合内是否为 1
二、通过“自定义信号集”设置“阻塞信号集”的函数
通过“自定义信号集”设置“阻塞信号集”的函数:sigprocmask
(1)函数原型:
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
(2)参数:
how :如何映射的,有三种
1)SIG_BLOCK :阻塞 ,自定义信号集和阻塞信号集 两个位图取或 。即:某个信号被其中任意一个集合阻塞,最终结果就是阻塞。
2)SIG_UNBLOCK :解除阻塞 ,先查看自定义信号集,记录设置为 1 的位置, 再查看阻塞信号集,对应位置,若是 1,改为 0,若是 0,则不动。
3)SIG_SETMASK :同步 ,自定义信号集覆盖阻塞信号集。
sigset_t *set: 传入参数,传入自定义信号集的地址。
sigset_t *oldest:传出参数,设置之前阻塞信号集状态 不关心,传 NULL。
三、读取当前进程未决信号集
读取当前进程未决信号集:sigpending 函数。
(1)函数原型:
int sigpending(sigset_t *set);
注意:为传出参数,而 set 是位图,无法直接读取,所以常配合 sigismember 使用。
(2)练习:打印当前进程的未决信号集
sigset_t set; // 定义一个信号集,用于存储未决信号集信息
sigpending(&set); // 获得未决信号集信息
for(int i = 1; i < 32; i++) // 循环读取 //注意:信号集编号 1-31
{
if( sigismember(&set, i) ) {
printf(“1”);
}
else {
printf(“0”);
} }