2011-07-08 14 views
9

Soy un novato en las señales de Linux, por favor ayuda. El siguiente código obtiene el volcado del núcleo cuando se ejecuta en Linux 2.6 gcc.Pregunta SIGFPE de la señal

$ ./a.out
punto flotante excepción (core dumped)

Las preguntas:
1. Dado que se ha instalado una máscara señal de proceso, si no el "SIGFPGE" generado por la línea 40 (z = x/y) estar bloqueado?
2. Si no está bloqueado, dado que se ha instalado un controlador de señal, ¿no debería capturar el "SIGFPE" el manejador de señal, en lugar de un volcado del núcleo?
3. Si comento la línea 40 (z = x/y), y uso la línea 42 (raise (SIGFPE)) en su lugar, todo funciona como esperaba. ¿Cuál es la diferencia entre x/0 y elevar SIGFPE aquí?

Aquí está el código:

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

Respuesta

4

Cualquier SIGFPE causada por una trampa de hardware, mientras que la señal es bloqueada provoca un comportamiento indefinido:

Si alguno de los SIGFPE, SIGILL SIGSEGV o SIGBUS las señales se generan mientras están bloqueadas, el resultado no está definido, a menos que la señal haya sido generada por la función kill(), la función sigqueue() o la función raise().

(de sigprocmask specification)

+0

+1. Aunque la última especificación es [Issue 7] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigprocmask.html). :-) – Nemo

+0

@Nemo: Gracias. La regla sigue ahí, pero la redacción cambió ligeramente, así que actualicé mi respuesta. –

+1

Gracias por las respuestas. Odio "indefinido". –