2014-04-24 8 views
0

맨 페이지와 Google이 도움이되지 않는 이상한 동작이 있습니다.sigprocmask를 사용하여 마스크를 설정하면 어디에서 호출합니까?

내 코드에서 SIGUSR2가 전송 될 때 SIGINT를 차단/차단 해제하려고합니다. 테스트에 대한

void handleBlock(int signal){ 
    if(sigintBlocked){ 
     printf("Unblocking SIGINT ...\n"); 
     sigprocmask(SIG_UNBLOCK, &signals_protected, NULL); 
     sigintBlocked = false; 
    } 
    else{ 
     printf("Blocking SIGINT ...\n"); 
     sigprocmask(SIG_BLOCK, &signals_protected, NULL); 
     sigintBlocked = true; 
    } 
} 

는 I이처럼 호출 :

SIGUSR2이 함수가 호출 전송되는 경우

void installSignallHandler(){ 

    sBlock.sa_handler = handleBlock; 
    sigemptyset(&sBlock.sa_mask); 
    sigaddset(&sBlock.sa_mask, SIGUSR2); 
    sBlock.sa_flags = 0; 
    sigaction(SIGUSR2, &sBlock, NULL); 

    sigemptyset(&signals_protected); 
    sigaddset(&signals_protected, SIGINT); 

    // For some reason sigprocmask only works if it is called here the first time 
    // sigprocmask(SIG_BLOCK, &signals_protected, NULL); 
    // sigintBlocked = true; 
} 

이 들어 I는 신호 처리기를 설치하고 함수 마스크 세트를 준비

int main(int argc, char **argv) { 
    installSignallHandler(); 
    while(1){ 
     printf("processing...\n"); 
     sleep(1); 
    } 
    return EXIT_SUCCESS; 
} 

이제 문제는 : 코드를 게시 한 방식으로 sigprocmask는 아무런 효과가 없습니다. 하지만 위의 두 줄을 주석 처리하지 않으면 작동합니다. 그래서 내 두 가지 질문 :

  1. 이 동작을 설명 할 수 있습니까?
  2. 해결하려면 어떻게해야합니까? - 차단 된 신호로 시작하고 싶지 않습니다.

답변

1

이기 때문에 경쟁 조건입니다. sig_handler에 sigintBlocked를 설정 한 다음 주 기능에서 유효성 검사를 수행 한 다음 설정되어 있으면 신호를 마스크 처리하십시오.

이 링크는이 문제를 해결하지만,이 경쟁 조건이 일어난 이유 @Sasi 나에게 약간의 설명을 제공하는 것이 가능하다 sigprocmask during signal's execution

+0

더 많은 정보를 가지고? 내 문제에 대한 링크에서 문제가 발생하지 않았습니다. – timmornYE

+1

@Wotim 시그널 핸들러 내에서 sigprocmask()가 불려 갔을 경우, 핸들러로부터 돌아와, 보류 중의 시그널 마스크를 복원 해, sigprocmask()의 ​​처리를 취소 할 수가 있습니다. – Sasi