1.一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集
sigemptyset 函数初始化信号集合set,将set 设置为空.
sigfillset 也初始化信号集合,只是将信号集合设置为所有信号的集合.
sigaddset 将信号signo 加入到信号集合之中,sigdelset 将信号从信号集合中删除.
sigdelset用来将参数signum代表的信号从参数set信号集里删除
sigismember 查询信号是否在信号集合之中.s
sigprocmask 是最为关键的一个函数.在使用之前要先设置好信号集合set.这个函数的作用是将指定的信号集合set 加入到进程的信号阻塞集合之中去,如果提供了oset 那么当前的进程信号阻塞集合将会保存在oset 里面.参数how 决定函数的操作方式:
SIG_BLOCK:增加一个信号集合到当前进程的阻塞集合之中.
SIG_UNBLOCK:从当前的阻塞集合之中删除一个信号集合.
SIG_SETMASK:将当前的信号集合设置为信号阻塞集合.
2.Test code from net.
#include <stdio.h> #include <signal.h> void checkset(); int main(int argc, char* argv[]) { sigset_t blockset; sigemptyset(&blockset); sigaddset(&blockset,SIGINT); sigaddset(&blockset,SIGTSTP); printf("first check "); checkset();
sigprocmask(SIG_SETMASK,&blockset,NULL); printf("second check "); checkset(); sigaddset(&blockset,SIGTERM); sigprocmask(SIG_BLOCK,&blockset,NULL); printf("third check "); checkset(); sigdelset(&blockset,SIGTERM); sigprocmask(SIG_UNBLOCK,&blockset,NULL); printf("forth check "); checkset(); return 0; } void checkset() { sigset_t set; printf("checksetstart: "); if(sigprocmask(0,NULL,&set)<0) { printf("checksetsigprocmask error!! "); exit(0); } if(sigismember(&set,SIGINT)) printf("sigint "); if(sigismember(&set,SIGTSTP)) printf("sigtstp "); if(sigismember(&set,SIGTERM)) printf("sigterm "); printf("checksetend "); }
测试输出
[root@localhost test]# ./signal
first check
checksetstart:
checksetend
second check
checksetstart:
sigint
sigtstp
checksetend
third check
checksetstart:
sigint
sigtstp
sigterm
checksetend
forth check
checksetstart:
sigterm
checksetend
上面sigprocmask(SIG_UNBLOCK,&blockset,NULL); 时,当前进程的信号屏蔽字{SIGINT,SIGTSTP,SIGTERM}
blockset 里存储了信号屏蔽字{SIGINT,SIGTSTP}。 调用之后 当前进程的信号屏蔽字为{SIGTERM}。
http://www.gnu.org/software/libc/manual/html_node/Signal-Sets.html#Signal-Sets
http://www.gnu.org/software/libc/manual/html_node/Blocking-Signals.html#Blocking-Signals