ieee_handler(3M-BSD)
MISC. REFERENCE MANUAL PAGE
iS
eee_handler(3M-BSD)
NAME
ieeehandler - IEEE exception trap handler function
SYNOPSIS
cc [ flag... ] file ... -lucb
#include <fp.h>
int ieeehandler(action,exception,hdl)
char action[], exception[];
sigfpehandlertype hdl;
DESCRIPTION
This function provides easy exception handling to exploit
ANSI/IEEE Std 754-1985 arithmetic in a C program. All argu-
ments are pointers to strings. Results arising from invalid
arguments and invalid combinations are undefined for effi-
ciency. There are three types of action : ``get'', ``set'',
and ``clear''. There are five types of exception :
``inexact''
``division'' ... division by zero exception
``underflow''
``overflow''
``invalid''
``all'' ... all five exceptions above
``common'' ... invalid, overflow, and division
exceptions
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 excep-
tion 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 == SIGFPEDEFAULT or
SIGFPEIGNORE; then ieeehandler will disable the trap on
exception. When hdl == SIGFPEABORT, any trap on exception
will dump core using abort(3). ``clear'' ``all'' disables
trapping on all five exceptions. Two steps are required to
intercept an IEEE-related SIGFPE code with ieeehandler:
1) Set up a handler with ieeehandler.
2) Perform a floating-point operation that generates the
intended IEEE exception. Unlike sigfpe(3),
ieeehandler also adjusts floating-point hardware mode
bits affecting IEEE trapping. For ``clear'', ``set''
SIGFPEDEFAULT, or ``set'' SIGFPEIGNORE, the hardware
trap is disabled. For any other ``set'', the hardware
trap is enabled. SIGFPE signals can be handled using
sigvec(2), signal(3), signal(3F), sigfpe(3), or
ieeehandler(3M). In a particular program, to avoid
confusion, use only one of these interfaces to handle
SIGFPE signals.
1
ieee_handler(3M-BSD)
MISC. REFERENCE MANUAL PAGE
iS
eee_handler(3M-BSD)
RETURN VALUE
ieeehandler normally returns 0. In the case of ``set'', 1
will be returned if the action is not available (for
instance, not supported in hardware).
EXAMPLE
A user-specified signal handler might look like this:
void samplehandler( 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->scpc);
}
and it might be set up like this:
extern void samplehandler;
main
{
sigfpehandlertype hdl, oldhandler1, oldhandler2;
/*
* save current overflow and invalid handlers
*/
ieeehandler("get","overflow",oldhandler1);
ieeehandler("get","invalid", oldhandler2);
/*
* set new overflow handler to samplehandler and set new
* invalid handler to SIGFPEABORT (abort on invalid)
*/
hdl = (sigfpehandlertype) samplehandler;
if(ieeehandler("set","overflow",hdl) != 0)
printf("ieeehandler can't set overflow \n");
if(ieeehandler("set","invalid",SIGFPEABORT) != 0)
printf("ieeehandler can't set invalid \n");
...
/*
* restore old overflow and invalid handlers
*/
ieeehandler("set","overflow", oldhandler1);
ieeehandler("set","invalid", oldhandler2);
}
FILES
/usr/include/fp.h
/usr/include/signal.h
2
ieee_handler(3M-BSD)
MISC. REFERENCE MANUAL PAGE
iS
eee_handler(3M-BSD)
SEE ALSO
floatingpoint(3), ieeehandler(3), sigfpe(3), signal(3)
sigvec(3), signal(2), abort(3C) in the Programmer's Refer-
ence Manual.
3