I am newbie on the Linux signals, please help. The following code get core dump when run in Linux 2.6 gcc.
$ ./a.out
Floating point exception (core dumped)
The questions:
1. Since a process signal mask is installed, shouldn't the "SIGFPGE" generated by line 40 volatile int z = x/y;
be blocked?
2. If it is not blocked, since a signal handler has been installed, shouldn't the "SIGFPE" be captured by the signal handler, instead of a core dump?
3. If I commented out line 40volatile int z = x/y;
, and use line 42 raise(SIGFPE);
instead, then everything works as I expected. What is the difference between x/0 and raise SIGFPE here?
Here is the code:
#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; //line 40
//raise(SIGFPE); //line 42
printf("point 1000\n");
return 0;
}
A floating point exception is an error that occurs when you try to do something impossible with a floating point number, such as divide by zero.
When a floating-point exception raises the SIGFPE signal, the process terminates and produces a core file if no signal-handler subroutine is present in the process. Otherwise, the process calls the signal-handler subroutine. Floating-point exception subroutines.
Floating-point exceptions in VFPThe exception is caused if the result of an operation has no mathematical value or cannot be represented. Division by zero. The exception is caused if a divide operation has a zero divisor and a dividend that is not zero, an infinity or a NaN.
Any SIGFPE caused by a hardware trap while the signal is blocked causes undefined behavior:
If any of the SIGFPE, SIGILL, SIGSEGV, or SIGBUS signals are generated while they are blocked, the result is undefined, unless the signal was generated by the kill() function, the sigqueue() function, or the raise() function.
(from sigprocmask
specification)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With