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