2015-11-07 46 views
0

我想用printf打印sigset。在這個程序中,我用sigprocmask來阻止SIGHUP和SIGTERM。在將set和oset初始化爲空集之後,它們會給出一些隨機的十六進制字符串作爲輸出。我應該如何解決這個問題?sigset_t unix使用sigprocmask()

另外,如果我在執行後按Ctrl-C,我對此程序的預期輸出有疑問。捕手功能是否也會繼承當前的信號設置,並且應該按照設置打印?

#include<stdio.h> 
#include<unistd.h> 
#include<signal.h> 
#include<bits/sigset.h> 
void catcher(int sig){ 
     sigset_t set; 
     sigprocmask(SIG_SETMASK, NULL, &set); 
     printf("%x inside function\n",set); 
} 
int main() 
{ 
     sigset_t set,oset; 
     signal(SIGINT,catcher); 
     sigemptyset(&set); 
     sigemptyset(&oset); 
     printf("%x\n",oset); 
     printf("%x\n",set); 
     sigaddset(&set,SIGHUP); 
     sigaddset(&set,SIGTERM); 
     sigprocmask(SIG_SETMASK,NULL,&oset); 
     printf("%x\n",oset); 
     printf("%x\n",set); 
     sigprocmask(SIG_BLOCK,&set,&oset); 
     pause(); 
     sigprocmask(SIG_SETMASK,&oset,&set); 
     printf("%x\n",set); 
} 

回答

0

手冊說:

的sigprocmask()執行功能檢查和/或改變電流信號 掩模(這些信號 從輸送被阻斷這一點)。如果信號是當前的 信號掩碼組的成員,則信號被阻止。

該面罩適用於整個過程,並用於屏蔽一些信號以便傳送。這裏沒有繼承。有一個掩碼在每個執行點描述了一組阻塞的信號。

您應該知道的是,默認情況下,當信號被捕獲時,它會自動添加到阻塞信號集中(以防止重新捕獲捕獲例程),並在結束時將其刪除。

你的代碼我的機器上執行得:

0   // empty set 
0   // empty oset 
0   // empty oset 
4001   // set = { HUP, TERM } 
^C4003  // in catcher, signal is automatically blocked set={HUP, INT, TERM} 
4001   // after catcher back in old state set={HUP,TERM} 

這意味着,位0和14用於SIGHUPSIGTERM,和第1位給SIGINT,這正是我在我的系統中找到頭文件:

#define SIGHUP 1  /* hangup */ 
#define SIGINT 2  /* interrupt */ 
#define SIGTERM 15  /* software termination signal from kill */ 
+0

捕手裏面,我使用'sigprocmask(SIG_SETMASK,NULL,&set);'如果它不影響當前的信號掩碼 – user3660655

+0

當然不是,NULL作爲第二個參數意味着沒有?新面具保持舊面貌。 –

+0

非常感謝....我在'sigprocmask()'中忘記了NULL參數的影響' – user3660655