每个信号都有两个标志位分别表示阻塞(block)和未决(pending),还有⼀个函数指针表示处理动作。
一旦信号被阻塞,信号产生后就会处于未决状态,直到信号阻塞被解除。
对信号的处理就是递达,有三种方式:忽略;执行默认动作;执行自定义动作
所以信号要经历的过程是产生–>未决(被阻塞时)–>递达
系统提供了一系列对信号集操作的函数:
int sigemptyset(sigset_t *set)对信号集清零,表示该信号集不包含任何有效信号。
int sigaddset(sigset_t *set)在该信号集中添加某种有效信号。
int sigismember(const sigset_t *set, int signo)判断该信号集中是否包含某种信号
int sigprocmask(int how, const sigset_t *set ,const sigset *oset)可以读取或更改进程的信号屏蔽字(block表)
int sigpending(sigset_t *set)读取当前进程的未决信号集(pending表),通过set参数传出,set是一个输出型参数
下面是一个测试程序:
添加了SIGINT信号并将其阻塞,每隔一秒打印出pending表,10秒后解除阻塞
程序运行结果:
前三秒信号未产生,第四秒信号产生,处于未决状态,10秒后信号阻塞解除,信号被递达,程序退出。