對信號函數sigaction的sa_mask的學習

#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

相關文章
相關標籤/搜索