#include <signal.h>
#include <floatingpoint.h>
sigfpe_handler_type sigfpe(code, hdl) sigfpe_code_type code; sigfpe_handler_type hdl;
This 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, specifying core dump using abort.3 or default handling respectively.
For these IEEE-related codes:
FPE_FLTINEX_TRAP fp_inexact - floating inexact result FPE_FLTDIV_TRAP fp_division - floating division by zero FPE_FLTUND_TRAP fp_underflow - floating underflow FPE_FLTOVF_TRAP fp_overflow - floating overflow FPE_FLTBSUN_TRAP fp_invalid - branch or set on unordered FPE_FLTOPERR_TRAP fp_invalid - floating operand error FPE_FLTNAN_TRAP fp_invalid - floating Not-A-Number
default handling is defined to be to call the handler specified to ieee_handler.3m
For all other SIGFPE codes, default handling is to core dump using abort.3
The compilation option -ffpa causes fpa recomputation to replace the default abort action for code FPE_FPA_ERROR. Note: SIGFPE_DEFAULT will restore abort rather than FPA recomputation for this code.
Three steps are required to intercept an IEEE-related SIGFPE code with sigfpe():
Unlike ieee_handler.3m sigfpe() never changes floating-point hardware mode bits affecting IEEE trapping. No IEEE-related SIGFPE signals will be generated unless those hardware mode bits are enabled.
SIGFPE
signals can be handled using
sigvec.2
signal.3v
sigfpe.3
or
ieee_handler.3m
In a particular program, to avoid confusion,
use only one of these interfaces to handle
SIGFPE
signals.
A user-specified signal handler might look like this:
void sample_handler( sig, code, scp, addr ) int sig ; /* sig == SIGFPE always */ int code ; struct sigcontext *scp ; char *addr ; { /* Sample user-written sigfpe code handler. Prints a message and continues. struct sigcontext is defined in <signal.h>. */ printf(" ieee exception code %x occurred at pc %X \n",code,scp->sc_pc); }
and it might be set up like this: extern void sample_handler(); main() { sigfpe_handler_type hdl, old_handler1, old_handler2; /* * save current overflow and invalid handlers; set the new * overflow handler to sample_handler() and set the new * invalid handler to SIGFPE_ABORT (abort on invalid) */ hdl = (sigfpe_handler_type) sample_handler; old_handler1 = sigfpe(FPE_FLTOVF_TRAP, hdl); old_handler2 = sigfpe(FPE_FLTOPERR_TRAP, SIGFPE_ABORT); ... /* * restore old overflow and invalid handlers */ sigfpe(FPE_FLTOVF_TRAP, old_handler1); sigfpe(FPE_FLTOPERR_TRAP, old_handler2); }
sigfpe() returns BADSIG if code is not zero or a defined SIGFPE code.
Created by unroff & hp-tools. © somebody (See intro for details). All Rights Reserved. Last modified 11/5/97