ieee_handler(3M) (BSD Compatibility Package) ieee_handler(3M)
NAME
ieee_handler - IEEE exception trap handler function
SYNOPSIS
cc [ flag... ] file ... -lucb
#include <fp.h>
int ieee_handler(action,exception,hdl)
char action[], exception[];
sigfpe_handler_type hdl;
DESCRIPTION
This function provides easy exception handling to exploit ANSI/IEEE
Std 754-1985 arithmetic in a C program. All arguments are pointers
to strings. Results arising from invalid arguments and invalid
combinations are undefined for efficiency.
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
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(3).
``clear'' ``all'' disables trapping on all five exceptions.
Two steps are required to intercept an IEEE-related SIGFPE code with
ieee_handler:
1) Set up a handler with ieee_handler.
2) Perform a floating-point operation that generates the intended
IEEE exception.
7/91 Page 1
ieee_handler(3M) (BSD Compatibility Package) ieee_handler(3M)
Unlike sigfpe(3), 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(2), signal(3), signal(3F),
sigfpe(3), or ieee_handler(3M). In a particular program, to avoid
confusion, use only one of these interfaces to handle SIGFPE signals.
RETURN VALUE
ieee_handler 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 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
*/
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");
...
Page 2 7/91
ieee_handler(3M) (BSD Compatibility Package) ieee_handler(3M)
/*
* restore old overflow and invalid handlers
*/
ieee_handler("set","overflow", old_handler1);
ieee_handler("set","invalid", old_handler2);
}
FILES
/usr/include/fp.h
/usr/include/signal.h
SEE ALSO
floatingpoint(3), ieee_handler(3), sigfpe(3), signal(3) sigvec(3),
signal(2), abort(3C) in the Programmer's Reference Manual.
7/91 Page 3