#include "apue.h"
static void sigparse1(int sig,siginfo_t * param,void * p2){
pr_mask("in sigparse1: "); // pr_mask("in sigparse1: "); 打印in sigparse1: 当前屏蔽信号
//raise(SIGUSR2);
sleep(5);
printf("end sigparse1\n");
}函数
static void sigparse2(int sig,siginfo_t * param,void *p2){
pr_mask("in sigparse2: ");
//raise(SIGUSR1);
sleep(5);
printf("end sigparse2\n");
}spa
int main (int argc, const char * argv[]) {
struct sigaction act;
act.sa_sigaction=sigparse1;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGUSR2);
sigaction(SIGUSR1, &act, NULL);
act.sa_sigaction = sigparse2;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
//sigaddset(&act.sa_mask,SIGUSR1);
sigaction(SIGUSR2, &act, NULL);
printf("start working ,send signal cmd:\nkill -s USR1 %d\n",getpid());
//raise(SIGUSR1);
//sleep(1);
//raise(SIGUSR2);
pause();
sleep(25);
return 0;
}get
下面是重点:cmd
sa_mask指定在信号处理程序执行过程当中,哪些信号应当被阻塞。缺省状况下当前信号自己被阻塞,防止信号的嵌套发送,除非指定SA_NODEFER或者SA_NOMASK标志位,处理程序执行完后,被阻塞的信号开始执行。io
注:请注意sa_mask指定的信号阻塞的前提条件,是在由sigaction()安装信号的处理函数执行过程当中由sa_mask指定的信号才被阻塞。gc
运行输出:程序
kill -s USR2 842
kill -s USR1 842
输出:
start working ,send signal cmd:
kill -s USR1 842
in sigparse2: SIGUSR2
in sigparse1: SIGUSR1 SIGUSR2
end sigparse1
end sigparse2
而若是这样:
kill -s USR1 854
kill -s USR2 854
输出:
start working ,send signal cmd:
kill -s USR1 854
in sigparse1: SIGUSR1 SIGUSR2
end sigparse1 //理应该等待5秒后才打印end sigparse1的 , 但是为何我发送kill -s USR2 854的时候 就立刻输出这句,而后进入sigparse2函数了 呢?
in sigparse2: SIGUSR2
end sigparse2static