2014-11-13 2 views
1

이 프로그램을 작성하여 SIGQUIT 신호 차단을 확인했습니다. 문제는 이전 상태로 복원 한 후 신호가 보류 중이지만 전달되지 않는 것입니다.보류중인 신호가 전달되지 않음

다음은 메인 프로그램

sigset_t newmask, oldmask, pendmask; 
if(signal(SIGQUIT,sig_quit)==SIG_ERR) //Register signal handler 
    printf("\nerror\n"); 
sigemptyset(&newmask); 
sigaddset(&newmask,SIGQUIT); 
sigprocmask(SIG_BLOCK,&newmask,&oldmask); //Save previous value and block SIGQUIT 
sleep(5); 
sigpending(&pendmask); 
if(sigismember(&pendmask,SIGQUIT)){ //Check if SIGQUIT is pending 
    printf("\nSIGQUIT pending..\n"); 
    fflush(stdout); 
} 
sigprocmask(SIG_BLOCK,&oldmask,NULL); //Restore old value of sigset 
printf("\nSIGQUIT unblocked\n"); 
fflush(stdout); 
sleep(5); //Sleep again to check if everything is A-okay! 

내가 처음 수면에 신호가 차단되는 것을 이해할 수에게 있습니다. 그러나 차단 해제 후에도 두 번째 절전 모드에서는 프로그램이 SIGQUIT에 응답하지 않습니다.

여기에 가능한 문제가 있습니까? 내가 여기

가상 코어

사용하고

PS는 SIGQUIT 차단을 해제하지 않기 때문에 당신은 당신이 생각하는 경우의 핸들러 함수

void sig_quit(int i) 
{ 
    printf("\nSIGQUIT caught\n"); 
    fflush(stdout); 
    signal(SIGQUIT,SIG_DFL); 
} 

답변

1

입니다 :

sigprocmask(SIG_BLOCK,&oldmask,NULL); //Restore old value of sigset 

SIG_BLOCK, sigprocmask로 현재 차단 된 신호에 oldmask을 추가 중입니다.

대신보십시오 :

sigprocmask(SIG_SETMASK,&oldmask,NULL); //Restore old value of sigset 

또한, sig_quit에 당신이 async-signal-safe 기능하지 않은 printf을 사용하고 있습니다. 예를 들어 write을 대신 사용할 수 있습니다.

+0

감사합니다. 나는 그 성명을 간과했다! –