#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"); }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; }下面是重点:
sa_mask指定在信号处理程序执行过程中,哪些信号应当被阻塞。缺省情况下当前信号本身被阻塞,防止信号的嵌套发送,除非指定SA_NODEFER或者SA_NOMASK标志位,处理程序执行完后,被阻塞的信号开始执行。
注:请注意sa_mask指定的信号阻塞的前提条件,是在由sigaction()安装信号的处理函数执行过程中由sa_mask指定的信号才被阻塞。
运行输出:
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 sigparse2