问题描述
||
我读了《 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并在不到5秒钟的时间内输入ctrl + c时,程序将立即结束。
如果在《 APUE》中以正确的方式工作,它将打印:
^\\
SIGQUIT pending
caught SIGQUIT
SIGQUIT unblocked
^\\Quit(coredump)
我是一个新的学习信号的人。请问我如何理解为什么?
其他错误出现时,我可以使用gdb。但是信号,所以请,谢谢
我在Ubuntu 10.04中工作
解决方法
CTRL+C
生成SIGINT
,CTRL-\\
生成SIGQUIT
。请参见终止信号-GNU C库