unixdev.net


Switch to SpeakEasy.net DSL

The Modular Manual Browser

Home Page
Manual: (SunOS-4.1.3)
Page:
Section:
Apropos / Subsearch:
optional field

SIGFPE(3)                  Library Functions Manual                  SIGFPE(3)



NAME
       sigfpe - signal handling for specific SIGFPE codes

SYNOPSIS
       #include <&lt;signal.h>&gt;

       #include <&lt;floatingpoint.h>&gt;

       sigfpe_handler_type sigfpe(code, hdl)
       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  par-
       ticular  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(3),  or
       default handling respectively.

       For these IEEE-related codes:
            FPE_FLTINEX_TRAP    fp_inexact - floating inexact result
            FPE_FLTDIV_TRAP     fp_division - floating division by zero
            FPE_FLTUND_TRAP     fp_underflow - floating underflow
            FPE_FLTOVF_TRAP     fp_overflow - floating overflow
            FPE_FLTBSUN_TRAP    fp_invalid - branch or set on unordered
            FPE_FLTOPERR_TRAP   fp_invalid - floating operand error
            FPE_FLTNAN_TRAP     fp_invalid - floating Not-A-Number

       default  handling  is  defined  to  be to call the handler specified to
       ieee_handler(3M).

       For all other SIGFPE codes, default handling  is  to  core  dump  using
       abort(3).

       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 hard-
                     ware, perhaps by using assembly-language instructions.

              3)     Perform  a  floating-point  operation  that generates the
                     intended IEEE exception.

       Unlike ieee_handler(3M), sigfpe() never changes floating-point hardware
       mode bits affecting IEEE trapping.  No IEEE-related SIGFPE signals will
       be generated unless those hardware mode bits are enabled.

       SIGFPE signals can be handled using sigvec(2),  signal(3V),  sigfpe(3),
       or  ieee_handler(3M).  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( 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 <&lt;signal.h>&gt;.
                  */
                 printf(" ieee exception code %x occurred at pc %X \n",code,scp->&gt;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);
            }

SEE ALSO
       sigvec(2), abort(3), floatingpoint(3), ieee_handler(3M), signal(3V)

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



                                21 October 1987                      SIGFPE(3)