Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

signal(2)

sigfpe(3)

sigvec(3)

signal(3-ucb)

abort(3C)

floatingpoint(3M)

ieee_handler(3M)        (BSD Compatibility Package)        ieee_handler(3M)

NAME
     ieeehandler - IEEE-Bearbeitungsroutine bei Unterbrechungen

SYNTAX
     /usr/ucb/cc [flag ...] file ... -lucb

     #include <fp.h>

     int ieeehandler(action, exception, hdl)
     char action[], exception[];
     sigfpehandlertype hdl;

BESCHREIBUNG
     Diese Funktion bietet eine einfache Bearbeitung von Ausnahmebedingun-
     gen für die Verwendung der Arithmetik des ANSI/IEEE-Standards 754-1985
     in einem C-Programm. Alle Argumente sind Zeiger auf Zeichenketten.
     Ergebnisse aus ungültigen Argumenten sowie ungültige Kombinationen
     sind aus Effektivitätsgründen undefiniert.

     Es gibt drei Typen für action: "get"(Abrufen), "set" (Setzen) und
     "clear" (Löschen) und fünf Typen für exception:

          "inexact"
          "division"     ... Ausnahmebedingung für Division durch Null

          "underflow"
          "overflow"
          "invalid"
          "all"          ... alle 5 oben genannten Ausnahmebedingungen

          "common"       ... Ausnahmebedingungen für "invalid", "overflow"
                             und "division"

     Die Ausnahmebedingungen "all" und "common" ergeben nur Sinn im Zusam-
     menhang mit "set" oder "clear".

     hdl enthält die Adresse einer Routine für die Signalbearbeitung.
     <fp.h> definiert sigfpehandlertype.

     "get" sucht die Position der aktuellen Bearbeitungroutine für
     exception in hdl. "set" setzt die Routine, auf die hdl zeigt, auf die
     Bearbeitungsroutine und aktiviert gleichzeitig die Unterbrechung bei
     exception, außer wenn hdl == SIGFPEDEFAULT oder SIGFPEIGNORE ist. In
     diesem Fall deaktiviert der ieeehandler die Unterbrechung bei
     exception. Wenn hdl == SIGFPEABORT ist, erstellt jede Unterbrechung
     bei exception einen Speicherabzug mit Hilfe von abort(3C). "clear"
     "all" deaktiviert das Unterbrechen (Trapping) bei allen fünf Ausnahme-
     bedingungen.

     Zwei Schritte sind erforderlich, um einen IEEE-bezogenen SIGFPE-Code
     mit ieeehandler abzufangen:




Seite 1                      Reliant UNIX 5.44               Gedruckt 11/98

ieee_handler(3M)        (BSD Compatibility Package)        ieee_handler(3M)

     1)  Einen Handler mit ieeehandler einrichten.

     2)  Eine Gleitkommaoperation durchführen, die die gewünschte IEEE-
         Ausnahmebedingung generiert.

     Im Gegensatz zu sigfpe paßt ieeehandler auch Bit für den Gleitkomma-
     Hardwaremodus an, die das IEEE-Unterbrechen betreffen. Die Hardwareun-
     terbrechung wird für "clear", "set" SIGFPEDEFAULT oder "set"
     SIGFPEIGNORE deaktiviert.

     Bei allen anderen "set"-Aktionen wird die Hardwareunterbrechung akti-
     viert.

     SIGFPE-Signale können mit Hilfe von sigvec(3), signal(2),
     signal(3-ucb), sigfpe(3) oder ieeehandler(3M) bearbeitet werden. Ver-
     wenden Sie in einem Programm nur jeweils eine dieser Schnittstellen
     zur Bearbeitung von SIGFPE-Signalen, um Komplikationen zu vermeiden.

RÜCKGABEWERT
     ieeehandler gibt normalerweise 0 zurück. Bei "set" wird jedoch 1
     zurückgegeben, wenn die Aktion nicht verfügbar ist (zum Beispiel wenn
     sie von der Hardware nicht unterstützt wird).
































Seite 2                      Reliant UNIX 5.44               Gedruckt 11/98

ieee_handler(3M)        (BSD Compatibility Package)        ieee_handler(3M)

BEISPIELE
     Eine vom Benutzer angegebene Routine zur Signalbearbeitung kann bei-
     spielsweise folgendermaßen aussehen:

     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);
     }

     Sie könnte folgendermaßen eingerichtet werden:

     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);
     }

DATEIEN
     /usr/include/fp.h

     /usr/include/signal.h



Seite 3                      Reliant UNIX 5.44               Gedruckt 11/98

ieee_handler(3M)        (BSD Compatibility Package)        ieee_handler(3M)

SIEHE AUCH
     signal(2), sigfpe(3), sigvec(3), signal(3-ucb), abort(3C),
     floatingpoint(3M).



















































Seite 4                      Reliant UNIX 5.44               Gedruckt 11/98

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