信号掩码 – 被阻塞的信号集
每个进程都有一个用来描述哪些信号传送来将被阻塞的信号集,如果某种信号在某个进程的阻塞信号集中,则传送到该进程的此种信号将会被阻塞。当前被进程阻塞的信号集也叫信号掩码,类型为sigset_t。每个进程都有自己的信号掩码,且创建子进程时,子进程会继承父进程的信号掩码。
信号阻塞和忽略的区别
阻塞的概念与忽略信号是不同的:操作系统在信号被进程解除阻塞之前不会将信号传递出去,被阻塞的信号也不会影响进程的行为,信号只是暂时被阻止传递;当进程忽略一个信号时,信号会被传递出去,但进程将信号丢弃。
信号集的操作
int sigemptyset(sigset_t *set); //清空信号集
int sigfillset(sigset_t *set); //将所有信号填充进 信号集set 中
int sigaddset(sigset_t *set, int signum); //往信号集 set 中添加信号 signum
int sigdelset(sigset_t *set, int signum); //往信号集 set 中移出信号 signum
//以上四个函数返回:若成功则为0,若出错则为-1
int sigismember(const sigset_t *set, int signum); //判断 signum 是不是包含在set 中,在返回 1,不在返回 0.
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); //设定对信号屏蔽集内的信号的处理方式(阻塞或不阻塞)
参数说明:
how : 用于指定信号修改的方式,可能选择有3种
SIG_BLOCK 将 set 所指向的信号集合中包含的信号加到当前的信号掩码中.即信号掩码与 set 信号集进行或操作.
SIG_UNBLOCK 将 set 所指向的信号集中包含的信号从当前的信号掩码中删除.即信号掩码和set进行与操作。
SIG_SETMASK 将set的值设定为新的进程信号掩码。即set对信号掩码进行了赋值操作。
set : 为指向信号集的指针,在此专指新设的信号集,如果仅想读取现在的屏蔽值,可将其置为NULL。
oldset : 也是指向信号集的指针,在此存放原来的信号集。可用来检测信号掩码中存在什么信号。
返回值:成功执行时,返回0。失败返回-1,errno被设为EINVAL。
版权声明:本文为博主原创文章,未经博主允许不得转载。