Current File : //usr/man/man3c/sigfpe.3c
'\" te
.\" Copyright (c) 1996, Sun Microsystems, Inc.
.TH sigfpe 3C "4 May 2004" "SunOS 5.11" "Standard C Library Functions"
.SH NAME
sigfpe \- signal handling for specific SIGFPE codes
.SH SYNOPSIS
.LP
.nf
#include <floatingpoint.h>
#include <siginfo.h>

\fBsigfpe_handler_type\fR \fBsigfpe\fR(\fBsigfpe_code_type\fR \fIcode\fR,
     \fBsigfpe_handler_type\fR \fIhdl\fR);
.fi

.SH DESCRIPTION
.sp
.LP
The \fBsigfpe()\fR function allows signal handling to be specified for particular \fBSIGFPE\fR codes.  A call to \fBsigfpe()\fR defines a new handler \fIhdl\fR for a particular \fBSIGFPE\fR \fIcode\fR and returns the old handler as the value of the function \fBsigfpe()\fR. Normally handlers are specified as pointers to functions; the special cases \fBSIGFPE_IGNORE\fR, \fBSIGFPE_ABORT\fR, and \fBSIGFPE_DEFAULT\fR allow ignoring, dumping core using \fBabort\fR(3C), or default handling respectively. Default handling is to dump core using \fBabort\fR(3C).
.sp
.LP
The \fIcode\fR argument is usually one of the five \fBIEEE\|754-related\fR \fBSIGFPE\fR codes:
.sp
.in +2
.nf
FPE_FLTRES   fp_inexact \(mi floating-point inexact result
FPE_FLTDIV   fp_division \(mi floating-point division by zero        
FPE_FLTUND   fp_underflow \(mi floating-point underflow
FPE_FLTOVF   fp_overflow \(mi floating-point overflow
FPE_FLTINV   fp_invalid \(mi floating-point invalid operation
.fi
.in -2

.sp
.LP
Three steps are required to intercept an \fBIEEE\|754-related\fR \fBSIGFPE\fR code with \fBsigfpe()\fR:
.RS +4
.TP
1.
Set up a handler with \fBsigfpe()\fR.
.RE
.RS +4
.TP
2.
Enable the relevant \fBIEEE\|754\fR trapping capability in the hardware, perhaps by using assembly-language instructions.
.RE
.RS +4
.TP
3.
Perform a floating-point operation that generates the intended \fBIEEE\|754\fR exception.
.RE
.sp
.LP
The \fBsigfpe()\fR function never changes floating-point hardware mode bits affecting \fBIEEE\|754\fR trapping.  No \fBIEEE\|754-related\fR \fBSIGFPE\fR signals will be generated unless those hardware mode bits are enabled.
.sp
.LP
\fBSIGFPE\fR signals can be handled using \fBsigfpe()\fR, \fBsigaction\fR(2) or \fBsignal\fR(3C). In a particular program, to avoid confusion, use only one of these interfaces to handle \fBSIGFPE\fR signals.
.SH EXAMPLES
.LP
\fBExample 1 \fRExample Of A User-Specified Signal Handler
.sp
.LP
A user-specified signal handler might look like this:

.sp
.in +2
.nf
#include <floatingpoint.h>
#include <siginfo.h>
#include <ucontext.h>
/*
* The sample_handler prints out a message then commits suicide.
*/
void
sample_handler(int sig, siginfo_t *sip, ucontext_t *uap) {
	char *label;
        switch (sip\(mi>si_code) {
	case FPE_FLTINV: label = "invalid operand"; break;
	case FPE_FLTRES: label = "inexact"; break;
	case FPE_FLTDIV: label = "division-by-zero"; break;
	case FPE_FLTUND: label = "underflow"; break;
	case FPE_FLTOVF: label = "overflow"; break;
	default: label = "???"; break;
	}
	fprintf(stderr, 
        "FP exception %s (0x%x) occurred at address %p.\en",
        label, sip\(mi>si_code, (void *) sip\(mi>si_addr);
	abort();
}
.fi
.in -2

.sp
.LP
and it might be set up like this: 

.sp
.in +2
.nf
#include <floatingpoint.h>
#include <siginfo.h>
#include <ucontext.h>
extern void sample_handler(int, siginfo_t *, ucontext_t *);
main(void) {
      sigfpe_handler_type hdl, old_handler1, old_handler2;
/*
 * save current fp_overflow and fp_invalid handlers; set the new
* fp_overflow handler to sample_handler(\|) and set the new
* fp_invalid handler to SIGFPE_ABORT (abort on invalid)
*/
    hdl = (sigfpe_handler_type) sample_handler;
    old_handler1 = sigfpe(FPE_FLTOVF, hdl);
    old_handler2 = sigfpe(FPE_FLTINV, SIGFPE_ABORT);
    .\|.\|.
/*
 * restore old fp_overflow and fp_invalid handlers
 */
     sigfpe(FPE_FLTOVF, old_handler1);
     sigfpe(FPE_FLTINV, old_handler2);
}
.fi
.in -2

.SH FILES
.sp
.ne 2
.mk
.na
\fB\fB/usr/include/floatingpoint.h\fR\fR
.ad
.sp .6
.RS 4n

.RE

.sp
.ne 2
.mk
.na
\fB\fB/usr/include/siginfo.h\fR\fR
.ad
.sp .6
.RS 4n

.RE

.SH ATTRIBUTES
.sp
.LP
See \fBattributes\fR(5) for descriptions of the following attributes:
.sp

.sp
.TS
tab() box;
cw(2.75i) |cw(2.75i) 
lw(2.75i) |lw(2.75i) 
.
ATTRIBUTE TYPEATTRIBUTE VALUE
_
MT-LevelSafe
.TE

.SH SEE ALSO
.sp
.LP
\fBsigaction\fR(2), \fBabort\fR(3C), \fBsignal\fR(3C), \fBattributes\fR(5), \fBfloatingpoint.h\fR(3HEAD)
.SH DIAGNOSTICS
.sp
.LP
The \fBsigfpe()\fR function returns (void(*)())-1 if \fIcode\fR is not zero or a defined \fBSIGFPE\fR code.