信号集操作函数,信号阻塞与未决
一、信号集及相关操作函数
信号集被定义为一种数据类型:
typedef struct {
unsigned long sig[_NSIG_WORDS];
} sigset_t
信号集用来描述信号的集合,每个信号占用一位(64位)。Linux所支持的所有信号可以全部或部分的出现在信号集中,主要与信号阻塞相关函数配合使用。下面是为信号集操作定义的相关函数:
#include <signal.h>
int sigemptyset(sigset_t *set);//信号集里面的所有信号被清空,相当于64为置0;
int sigfillset(sigset_t *set);//相当于64为都置1;
int sigaddset(sigset_t *set, int signum)//在set指向的信号集中加入signum信号
int sigdelset(sigset_t *set, int signum);//在set指向的信号集中删除signum信号
int sigismember(const sigset_t *set, int signum);//判定信号signum是否在set指向的信号集中
sigemptyset(sigset_t *set):信号集里面的所有信号被清空,相当于64为置0;
sigfillset(sigset_t *set):相当于64为都置1;
sigaddset(sigset_t *set, int signum):在set指向的信号集中加入signum信号,相当于将给定信号所对应的位置1;
sigdelset(sigset_t *set, int signum):在set指向的信号集中删除signum信号,相当于将给定信号所对应的位置0;
sigismember(const sigset_t *set, int signum):判定信号signum是否在set指向的信号集中,相当于检查给定信号所对应的位是0还是1。
二、信号阻塞及未决相关的函数操作:
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset));
int sigpending(sigset_t *set));
int sigsuspend(const sigset_t *mask));
sigprocmask()函数能够根据参数how来实现对信号集的操作,操作主要有三种:
SIG_BLOCK :在阻塞信号集中添加set指向信号集中的信号,相当于:mask=mask|set
SIG_UNBLOCK :如果进程阻塞信号集中包含set信号集中的信号,则解除对该信号的阻塞,相当于:mask=mask|~set
SIG_SETMASK :更新阻塞信号集为set指向的信号集,相当于mask=set
sigpending(sigset_t *set))获得当前已递送到进程,却被阻塞的所有信号,在set指向的信号集中返回结果。
sigsuspend(const sigset_t *mask))用于在接收到某个信号之前, 临时用mask替换进程的信号掩码, 并暂停进程执行,直到收到信号为止。
sigsuspend 返回后将恢复调用之前的信号掩码。信号处理函数完成后,进程将继续执行。该系统调用始终返回-1,并将errno设置为EINTR。