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;
}
+1. Aunque la última especificación es [Issue 7] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigprocmask.html). :-) – Nemo
@Nemo: Gracias. La regla sigue ahí, pero la redacción cambió ligeramente, así que actualicé mi respuesta. –
Gracias por las respuestas. Odio "indefinido". –