2011-07-08 107 views
9

我是Linux新手,請幫忙。 以下代碼在Linux 2.6 gcc中運行時會獲得核心轉儲。SIGFPE信號問題

$ ./a.out
浮點異常(核心轉儲)

的問題:
1.由於安裝過程信號掩模,應該不是 「SIGFPGE」 通過線中產生40(z = x/y)被阻擋?
2.如果未被阻止,由於已經安裝了信號處理程序,不應該由信號處理程序捕獲「SIGFPE」而不是核心轉儲?
3.如果我將第40行(z = x/y)註釋掉,並使用第42行(raise(SIGFPE)),則所有內容都按我的預期工作。這裏有什麼區別x/0和提高SIGFPE?

下面是代碼:

#include <stdio.h> 
    #include <stdlib.h> 
    #include <signal.h> 

    void sig_handler(int signum) 
    { 
     printf("sig_handler() received signal %d\n", signum); 
    } 


    int main(int argc, char * argv[]) 
    { 

     // setup signal mask, block all signals 
     sigset_t set; 
     sigfillset(&set); 

     if(sigprocmask(SIG_BLOCK, &set, NULL)<0) 
     { 
      perror("failed to set sigmask"); 
      return -1; 
     } 

     // install signal handler for SIGFPE 
     struct sigaction act; 
     act.sa_handler = sig_handler; 
     act.sa_mask = set; 
     act.sa_flags = 0; 
     if(sigaction(SIGFPE, &act, NULL)<0) 
     { 
      perror("sigaction failed"); 
      exit(-1); 
     } 

     volatile int x =1; 
     volatile int y =0; 
     volatile int z = x/y; 

     //raise(SIGFPE); 

     printf("point 1000\n"); 

     return 0; 
    } 

回答

4

引起的硬件陷阱而信號被阻斷的任何SIGFPE導致未定義的行爲:

如果任何SIGFPE的,SIGILL,SIGSEGV或SIGBUS除非信號由kill()函數,sigqueue()函數或raise()函數生成,否則信號會在被阻止時生成,結果是未定義的。

(從sigprocmask specification

+0

1。雖然最新的規範是[問題7](http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigprocmask.html)。 :-) – Nemo

+0

@Nemo:謝謝。規則仍然存在,但措辭略有改變,所以我更新了答案。 –

+1

感謝您的答案。我討厭「未定義」。 –