SIGFPE(3C) Standard C Library Functions SIGFPE(3C)
NAME
sigfpe - signal handling for specific SIGFPE codes
SYNOPSIS
#include <floatingpoint.h>
#include <siginfo.h>
sigfpe_handler_type sigfpe(
sigfpe_code_type code,
sigfpe_handler_type hdl);
DESCRIPTION
The
sigfpe() function allows signal handling to be specified for
particular
SIGFPE codes. A call to
sigfpe() defines a new handler
hdl for a particular
SIGFPE code and returns the old handler as the
value of the function
sigfpe(). Normally handlers are specified as
pointers to functions; the special cases
SIGFPE_IGNORE,
SIGFPE_ABORT,
and
SIGFPE_DEFAULT allow ignoring, dumping core using
abort(3C), or
default handling respectively. Default handling is to dump core using
abort(3C).
The
code argument is usually one of the five
IEEE754-related SIGFPE codes:
FPE_FLTRES fp_inexact - floating-point inexact result
FPE_FLTDIV fp_division - floating-point division by zero
FPE_FLTUND fp_underflow - floating-point underflow
FPE_FLTOVF fp_overflow - floating-point overflow
FPE_FLTINV fp_invalid - floating-point invalid operation
And additionally on the x86 architecture:
FPE_FLTDEN fp_denormalized - floating-point denormalized result
Three steps are required to intercept an
IEEE754-related SIGFPE code
with
sigfpe():
1. Set up a handler with
sigfpe().
2. Enable the relevant
IEEE754 trapping capability in the
hardware, perhaps by using assembly-language instructions.
3. Perform a floating-point operation that generates the
intended
IEEE754 exception.
The
sigfpe() function never changes floating-point hardware mode bits
affecting
IEEE754 trapping. No
IEEE754-related SIGFPE signals will
be generated unless those hardware mode bits are enabled.
SIGFPE signals can be handled using
sigfpe(),
sigaction(2) or
signal(3C). In a particular program, to avoid confusion, use only one
of these interfaces to handle
SIGFPE signals.
EXAMPLES
Example 1: Example Of A User-Specified Signal Handler
A user-specified signal handler might look like this:
#include <floatingpoint.h>
#include <siginfo.h>
#include <ucontext.h>
/*
* The sample_handler prints out a message then commits suicide.
*/
void
sample_handler(int sig, siginfo_t *sip, ucontext_t *uap) {
char *label;
switch (sip->si_code) {
case FPE_FLTINV: label = "invalid operand"; break;
case FPE_FLTRES: label = "inexact"; break;
case FPE_FLTDIV: label = "division-by-zero"; break;
case FPE_FLTUND: label = "underflow"; break;
case FPE_FLTOVF: label = "overflow"; break;
default: label = "???"; break;
}
fprintf(stderr,
"FP exception %s (0x%x) occurred at address %p.\n",
label, sip->si_code, (void *) sip->si_addr);
abort();
}
and it might be set up like this:
#include <floatingpoint.h>
#include <siginfo.h>
#include <ucontext.h>
extern void sample_handler(int, siginfo_t *, ucontext_t *);
main(void) {
sigfpe_handler_type hdl, old_handler1, old_handler2;
/*
* save current fp_overflow and fp_invalid handlers; set the new
* fp_overflow handler to sample_handler() and set the new
* fp_invalid handler to SIGFPE_ABORT (abort on invalid)
*/
hdl = (sigfpe_handler_type) sample_handler;
old_handler1 = sigfpe(FPE_FLTOVF, hdl);
old_handler2 = sigfpe(FPE_FLTINV, SIGFPE_ABORT);
...
/*
* restore old fp_overflow and fp_invalid handlers
*/
sigfpe(FPE_FLTOVF, old_handler1);
sigfpe(FPE_FLTINV, old_handler2);
}
FILES
/usr/include/floatingpoint.h /usr/include/siginfo.hATTRIBUTES
See
attributes(7) for descriptions of the following attributes:
+---------------+-----------------+
|ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+---------------+-----------------+
|MT-Level | Safe |
+---------------+-----------------+
SEE ALSO
sigaction(2),
abort(3C),
signal(3C),
floatingpoint.h(3HEAD),
attributes(7)DIAGNOSTICS
The
sigfpe() function returns (void(*)())-1 if
code is not zero or a
defined
SIGFPE code.
May 4, 2004 SIGFPE(3C)