2011-07-08 6 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。最新の仕様は[Issue 7](http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigprocmask.html)です。 :-) – Nemo

+0

@ニモ:ありがとう。ルールはまだありますが、言葉遣いが少し変わったので、私は答えを更新しました。 –

+1

答えをありがとう。私は "未定義"が嫌いです。 –