sigfpe(3BSD) (BSD System Compatibility) sigfpe(3BSD)
NAME
sigfpe - (BSD) signal handling for specific SIGFPE codes
SYNOPSIS
/usr/ucb/cc [flag . . . ] file . . .
#include <signal.h>
#include <fp.h>
sigfpe_handler_type sigfpe(sigfpe_code_type code, sigfpe_handler_type hdl);
DESCRIPTION
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(3C), 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(3BSD).
For all other SIGFPE codes, default handling is to core dump
using abort(3C).
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:
1.
Set up a handler with sigfpe.
Copyright 1994 Novell, Inc. Page 1
sigfpe(3BSD) (BSD System Compatibility) sigfpe(3BSD)
2.
Enable the relevant IEEE trapping capability in the
hardware, perhaps by using assembly-language instructions.
3.
Perform a floating-point operation that generates the
intended IEEE exception.
Unlike ieee_handler(3BSD), 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(3BSD),
signal(3BSD), sigfpe(3BSD), or ieee_handler(3BSD). In a
particular program, to avoid confusion, use only one of these
interfaces to handle SIGFPE signals.
EXAMPLE
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)
Copyright 1994 Novell, Inc. Page 2
sigfpe(3BSD) (BSD System Compatibility) sigfpe(3BSD)
*/
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);
}
FILES
/usr/ucbinclude/fp.h
/usr/ucbinclude/signal.h
REFERENCES
abort(3C), floatingpoint(3BSD), ieee_handler(3BSD),
signal(3BSD), sigvec(3BSD)
RETURN VALUE
sigfpe returns BADSIG if code is not zero or a defined SIGFPE
code.
Copyright 1994 Novell, Inc. Page 3