2012-11-20 57 views
1

我正在嘗試創建一個程序來阻止信號SIGUSR1並解除阻塞信號。 在中間我想看到信號被阻止使用sigpending。但它總是說信號沒有被阻擋,並且當它應該被阻止時我可以使用該信號。 這是我的代碼。如何阻止C中的信號?

#include <stdlib.h> 
#include <stdio.h> 
#include <signal.h> 

static void signals(int signaln) 
{ 
    switch (signaln) { 
    case SIGUSR1: 
    printf("Signal SIGUSR1\n"); break; 
    } 
    return; 
} 
main() 
{ 
    sigset_t set,set2; 
    struct sigaction sigs; 
    sigs.sa_handler = signals; 
    sigemptyset(&sigs.sa_mask); 
    sigs.sa_flags=SA_ONESHOT; 
    sigaction(SIGUSR1, &sigs,0); 
    sigemptyset(&set); 
    sigemptyset(&set2); 
    sigaddset(&set,SIGUSR1); 
    if(sigprocmask(SIG_BLOCK, &set, NULL)==0){ 
    printf("Blocking SISGUSR1...\n"); 
    } 
    sigpending(&set2); 
    if (sigismember(&set2,SIGUSR1)==1) 
    { 
    printf("The signal is blocked\n"); //it should print this 
    } 
    wait(2); 
    kill(getpid(),SIGUSR1); //the signal shouldn't work 
    wait(2); 
    if(sigprocmask(SIG_UNBLOCK, &set, NULL)==0){ 
    printf("Unblocking SIGUSR1\n"); 
    } 
} 

任何人都可以幫助我嗎?

回答

1

sigpending不會告訴你信號是否被阻塞。它告訴你一個信號是否在等待傳送。 (即,信號被阻止之一已經被髮送。)

另外,阻塞不意味着信號不會被傳遞;這意味着信號現在不會被傳送。所以你可以發送信號,一旦信號被解除,信號就會被髮送出去;可能在呼叫sigprocmask(SIGUNBLOCKED...)之後,但在呼叫printf之前,所以在看到「解除阻止」消息之前,您可能會看到收到的信號。

+1

非常感謝。我明白我必須做什麼;)我必須在簽署之前使用kill。 – Jack