Я прочитал «APUE» и обнаружил, что пример 10.11 не может дать правильный ответ.
файл 10.11:
static void sig_quit( int );
int main( void )
{
sigset_t newmask, oldmask, pendmask;
if ( signal( SIGQUIT, sig_quit ) == SIG_ERR )
err_sys( "can't catch SIGQUIT" );
sigemptyset( &newmask );
sigaddset( &newmask, SIGQUIT );
/* block SIGQUIT and save current signal mask */
if ( sigprocmask( SIG_BLOCK, &newmask, &oldmask ) < 0 )
err_sys( "SIG_BLOCK error" );
sleep( 5 ); /* SIGQUIT here will remain pending */
if ( sigpending( &pendmask ) < 0 )
err_sys( "sigpending error" );
if ( sigismember( &pendmask, SIGQUIT ) )
printf( "\nSIGQUIT pengding\n" );
/* reset signal mask which unblocks SIGQUIT */
if ( sigprocmask( SIG_SETMASK, &oldmask, NULL ) > 0 )
err_sys( "SIG_SETMASK error" );
printf( "SIGQUIT unblocked\n" );
sleep( 5 ); /* SIGQUIT here will terminate with core file */
exit( 0 );
}
static void sig_quit( int signo )
{
printf( "caught SIGQUIT\n" );
if ( signal( SIGQUIT, SIG_DFL ) == SIG_ERR )
err_sys( "can't reset SIG_QUIT" );
return ;
}
когда я выполню ./a.out и наберу ctrl + c менее чем за 5 секунд, программа будет немедленно завершена.
если он работает правильно в «APUE», он напечатает:
^\
SIGQUIT pending
caught SIGQUIT
SIGQUIT unblocked
^\Quit(coredump)
Я новичок в изучении сигнала. Подскажите, пожалуйста, как понять, почему?
Я могу использовать GDB, когда появились другие ошибки. но сигнал, так что, пожалуйста, спасибо
я работаю в Ubuntu 10.04