2011-04-13 69 views
1

我讀了「APUE」,我發現10.11的例子不能創建正確的答案。 的10.11文件是:你好,關於信號的「APUE」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 ; 
} 

當我在執行CTRL + C少5秒./a.out和鍵,程序將結束的時候了。 如果在「APUE」以正確的方式工作,它會打印:

^\ 
SIGQUIT pending 
caught SIGQUIT 
SIGQUIT unblocked 
^\Quit(coredump) 

我是一個新的學習signal.please我怎麼明白爲什麼? 當出現其他錯誤時,我可以使用gdb。但信號,所以請,謝謝 我在Ubuntu 10.04

回答