sigfpe(3) (BSD Compatibility Package) sigfpe(3)
NAME
sigfpe - Signalbearbeitung für bestimmte SIGFPE-Codes
SYNTAX
/usr/ucb/cc [flag ...] file ... -lucb
#include <signal.h>
#include <floatingpoint.h>
sigfpehandlertype sigfpe(code, hdl)
sigfpecodetype code;
sigfpehandlertype hdl;
BESCHREIBUNG
Mit dieser Funktion kann die Bearbeitung von Signalen für bestimmte
SIGFPE-Codes angegeben werden. Ein Aufruf von sigfpe definiert eine
neue Bearbeitungsroutine hdl für einen bestimmten SIGFPE-Code code und
gibt die alte Bearbeitungsroutine als den Wert der Funktion sigfpe
zurück. Normalerweise werden Bearbeitungsroutinen als Zeiger auf Funk-
tionen angegeben. Die Sonderfälle SIGFPEIGNORE, SIGFPEABORT und
SIGFPEDEFAULT erlauben ein Ignorieren des Signals, die Angabe eines
Speicherabzugs durch abort bzw. die Standardbearbeitung.
Für die folgenden IEEE-Codes wird standardmäßig die für
ieeehandler(3M) angegebene Bearbeitungsroutine aufgerufen:
FPEFLTINEXTRAP fpinexact Gleitkommafehler: ungenaues Ergebnis
FPEFLTDIVTRAP fpdivision Gleitkommafehler: Division durch Null
FPEFLTUNDTRAP fpunderflow Gleitkommafehler: Unterlauf
FPEFLTOVFTRAP fpoverflow Gleitkommafehler: Überlauf
FPEFLTBSUNTRAP fpinvalid Verzweigen oder auf "unsortiert" (unordered)
setzen
FPEFLTOPERRTRAP fpinvalid Gleitkommafehler: Operand
FPEFLTNANTRAP fpinvalid Gleitkommafehler: NaN (Not-A-Number)
Für alle anderen SIGFPE-Codes wird standardmäßig ein Speicherabzug
durch abort(3C) erstellt.
Mit der Kompilierungsoption -ffpa erfolgt eine FPA-Neuberechnung, um
die standardmäßige Abbruchaktion für den Code FPEFPAERROR zu ersetz-
ten. Hinweis: SIGFPEDEFAULT beendet den Prozeß und stellt die FPA-
Neuberechnung für diesen Code nicht wieder her.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
sigfpe(3) (BSD Compatibility Package) sigfpe(3)
Drei Schritte sind erforderlich, um einen IEEE-SIGFPE-Code mit sigfpe
abzufangen:
1) Eine Bearbeitungsroutine mit sigfpe einrichten.
2) Die entsprechende IEEE-Unterbrechungsfunktion in der Hardware akti-
vieren, möglicherweise mit Hilfe von Anweisungen einer Assembler-
Sprache.
3) Eine Gleitkommaoperation durchführen, die die gewünschte IEEE-
Ausnahmebedingung generiert.
Im Gegensatz zu ieeehandler(3M) ändert sigfpe niemals die Bits für
den Gleitkomma-Hardwaremodus, die die IEEE-Unterbrechung betreffen. Es
werden keine IEEE-SIGFPE-Signale generiert, wenn diese Hardwaremodus-
Bits nicht aktiviert sind.
SIGFPE-Signale können mit Hilfe von sigvec(3), signal(3-ucb),
sigfpe(3) oder ieeehandler(3M) bearbeitet werden. Verwenden Sie in
einem Programm nur jeweils eine dieser Schnittstellen zur Bearbeitung
von SIGFPE-Signalen, um Komplikationen zu vermeiden.
BEISPIELE
Eine vom Benutzer angegebener Routine zur Signalbearbeitung kann fol-
gendermaß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);
}
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
sigfpe(3) (BSD Compatibility Package) sigfpe(3)
Sie könnte folgendermaßen eingerichtet werden:
extern void samplehandler;
main
{
sigfpehandlertype hdl, oldhandler1, oldhandler2;
/*
* save current overflow and invalid handlers; set the new
* overflow handler to samplehandler and set the new
* invalid handler to SIGFPEABORT (abort on invalid)
*/
hdl = (sigfpehandlertype) samplehandler;
oldhandler1 = sigfpe(FPEFLTOVFTRAP, hdl);
oldhandler2 = sigfpe(FPEFLTOPERRTRAP, SIGFPEABORT);
...
/*
* restore old overflow and invalid handlers
*/
sigfpe(FPEFLTOVFTRAP, oldhandler1);
sigfpe(FPEFLTOPERRTRAP, oldhandler2);
}
RÜCKGABEWERT
sigfpe gibt BADSIG zurück, wenn code weder Null noch ein definierter
SIGFPE-Code ist.
DATEIEN
/usr/include/floatingpoint.h
/usr/include/signal.h
SIEHE AUCH
sigvec(3), signal(3-ucb), abort(3C), floatingpoint(3M),
ieeehandler(3M), signal(5).
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98