2014-11-13 3 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 Я использую CentOS

Вот функция

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

ответ

1

обработчик Это потому, что вы не разблокирование SIGQUIT, когда вы думаете:

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 вы используете printf, который не является async-signal-safe функция. Вместо этого вы можете использовать, например, write.

+0

Спасибо! Я забыл это заявление! –

Смежные вопросы