2011-07-08 21 views
9

Linux sinyallerinde yeni çıkıyorum, lütfen yardım edin. Aşağıdaki kod Linux 2.6 gcc'de çalıştırıldığında çekirdek dökümü alır.Sinyal SIGFPE soru

$ ./a.out
Kayan nokta özel durumu (çekirdek döküldü)

sorular:
1. Bir süreç sinyal maskesi takılı olduğundan, olmamalı hattı tarafından üretilen "SIGFPGE" 40 (z = x/y) engellenmeli mi?
2. Bir sinyal işleyicisi kurulduğundan, engellenmemişse, "SIGFPE" bir çekirdek dökümü yerine sinyal işleyici tarafından yakalanmamalıdır?
3. Eğer satır 40'ı (z = x/y) yorumladıysanız ve bunun yerine satır 42'yi (yükselt (SIGFPE)) kullanırsam, her şey beklediğim gibi çalışır. X/0 ile SIGFPE arasındaki fark nedir? Burada

kodudur:

#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; 
    } 

cevap

4

sinyal bloke ederken, bir donanım tuzak kaynaklanan herhangi bir SIGFPE tanımsız davranış neden olur:

SIGFPE herhangi SIGILL, SIGSEGV veya SIGBUS Eğer sinyaller, bloke edilirken oluşturulur, sinyal, kill() işlevi, sigqueue() işlevi veya yükseltme() işlevi tarafından üretilmediyse, sonuç tanımsızdır.

(sigprocmask specification den)

+0

+1. En son spesifikasyon [Sayı 7] olmasına rağmen (http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigprocmask.html). :-) – Nemo

+0

@Nemo: Teşekkürler. Kural hâlâ orada, ancak sözcük biraz değişti, bu yüzden cevabımı güncelledim. –

+1

Cevaplar için teşekkürler. "Tanımsız" dan nefret ediyorum. –