由于不同的信号数量可能会超过一个整型数的位数,Unix提供的系统基本数据类型sigset_t被广泛用于信号相关的API,如果我们需要查看或设置未决信号集或阻塞信号集,往往都要通过sigset_t参数进行操作。POSIX标准定义了有关于信号集数据类型的5的API
#include <signal.h>
int sigemptyset(sigset_t* set); //将信号集所有位都置0
int sigfillset(sigset_t* set); //将信号集所有位都置1
int sigaddset(sigset_t* set,int signo); //信号集某一位(特定信号)置1
int sigdelset(sigset_t* set,int signo); //信号集某一位置0
int sigismember(const sigset_t* set,int signo); //判断某一位是否为1
POSIX规定在使用信号集数据类型必须先调用sigemptyset或sigfillset进行初始化操作
sigprocmask
sigprocmask可以查改进程的阻塞信号集(信号屏蔽字),它只适用于单线程进程
int sigprocmask(int how,const sigset_t* set,sigset_t* oset);
//oset用于返回当前信号屏蔽字
//set和how共同绝对对信号屏蔽字的处理
how的取值
- SIG_BLOCK : set对原信号屏蔽字进行新增操作
- SIG_UNBLOCK :set对原信号屏蔽字进行删除操作
- SIG_SETMASK :set对原信号屏蔽字进行覆盖操作
sigpending
sigpending可以查进程的未决信号集
int sigpending(sigset_t* set);
sigpending返回的信号集,比特位为1的信号因被阻塞而不能被传递。因此处于挂起状态。