|
|
/usr/ucb/cc [flag . . . ] file . . .#include <fp.h>
int ieee_handler(char action[], char exception[], sigfpe_handler_type hdl);
There are three types of action: get, set, and clear. There are five types of exception:
Note: all and common only make sense with set or clear
hdl contains the address of a signal-handling routine. fp.h defines sigfpe_handler_type.
get will get the location of the current handler routine for exception in hdl . set will set the routine pointed at by hdl to be the handler routine and at the same time enable the trap on exception, except when hdl == SIGFPE_DEFAULT or SIGFPE_IGNORE; then ieee_handler will disable the trap on exception. When hdl == SIGFPE_ABORT, any trap on exception will dump core using abort(3C). clear all disables trapping on all five exceptions.
Two steps are required to intercept an IEEE-related SIGFPE code with ieee_handler:
Unlike sigfpe(3bsd), ieee_handler also adjusts floating-point hardware mode bits affecting IEEE trapping. For clear, set SIGFPE_DEFAULT, or set SIGFPE_IGNORE, the hardware trap is disabled. For any other set, the hardware trap is enabled.
SIGFPE signals can be handled using sigvec(3bsd), signal(3bsd), sigfpe(3bsd), or ieee_handler. 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(int sig, int code, struct sigcontext *scp, char *addr); /* sig == SIGFPE always */ { /* 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 */ ieee_handler("get","overflow",old_handler1); ieee_handler("get","invalid", old_handler2); /* * set new overflow handler to sample_handler and set new * invalid handler to SIGFPE_ABORT (abort on invalid) */ hdl = (sigfpe_handler_type) sample_handler; if(ieee_handler("set","overflow",hdl) != 0) printf("ieee_handler can't set overflow \n"); if(ieee_handler("set","invalid",SIGFPE_ABORT) != 0) printf("ieee_handler can't set invalid \n"); ... /* * restore old overflow and invalid handlers */ ieee_handler("set","overflow", old_handler1); ieee_handler("set","invalid", old_handler2); }