Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ sigfpe(3B) — SunOS 5.1

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

signal(2)

abort(3C)

floatingpoint(3B)

sigfpe(3B)

sigvec(3B)

sigfpe(3B)

NAME

sigfpe − signal handling for specific SIGFPE codes

SYNOPSIS

/usr/ucb/cc [ flag ... ] file ...

#include <signal.h>
#include <floatingpoint.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_TRAPfp_inexactfloating inexact result
FPE_FLTDIV_TRAPfp_divisionfloating division by zero
FPE_FLTUND_TRAPfp_underflowfloating underflow
FPE_FLTOVF_TRAPfp_overflowfloating overflow
FPE_FLTBSUN_TRAPfp_invalidbranch or set on unordered
FPE_FLTOPERR_TRAPfp_invalidfloating operand error
FPE_FLTNAN_TRAPfp_invalidfloating Not-A-Number
 

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(). 

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. 

SIGFPE signals can be handled using sigvec(3B), signal(2), sigfpe(3B).  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( int sig, 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);
}
 

RETURN VALUES

sigfpe() returns BADSIG if code is not zero or a defined SIGFPE code. 

SEE ALSO

signal(2), abort(3C), floatingpoint(3B), sigfpe(3B), sigvec(3B)

SunOS 5.1  —  Last change: 5 Jul 1990

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026