2012-11-20 5 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

대단히 감사합니다. 나는 내가해야 할 일을 이해했다.) 나는 지체하기 전에 살인을해야만한다. – Jack