setjmp(3C) setjmp(3C)
NAME
setjmp, longjmp - Nichtlokaler Sprung
SYNTAX
#include <setjmp.h>
int setjmp(jmpbuf env);
void longjmp(jmpbuf env, int val);
BESCHREIBUNG
Mit diesen Funktionen können Fehler und Interrupts bearbeitet werden,
die in einer betriebssystemnahen Funktion eines Programms auftreten.
Die Funktion setjmp() sichert die Aufrufumgebung in env (dessen Typ
jmpbuf in der Include-Datei setjmp.h definiert ist) für eine spätere
Verwendung durch longjmp(). Sie gibt den Wert 0 zurück.
longjmp() stellt die Umgebung wieder her, die durch den letzten Aufruf
von setjmp() mit dem entsprechenden Argument env gesichert wurde. Wenn
kein solcher Aufruf erfolgte, oder wenn die Ausführung des setjmp()-
Aufrufs in der Zwischenzeit beendet wurde, ist das Verhalten unbe-
stimmt. Es ist nicht definiert, ob longjmp() die Signalmaske wiede-
rherstellt, die Signalmaske unverändert läßt oder sie auf den Wert
zurücksetzt, den sie zur Zeit des setjmp()-Aufrufs hatte.
Alle Objekte, auf die zugegriffen werden kann, haben die gleichen
Werte, die sie auch beim Aufruf von longjmp() hatten, mit der Aus-
nahme, daß die Werte von Objekten mit einer Lebensdauer des Speicher-
bereichs für automatische Variablen (Automatic Storage Duration) unbe-
stimmt sind, wenn sie den folgenden Kriterien entsprechen:
- Es handelt sich um lokale Objekte in Bezug auf die Funktion, die
den setjmp()-Aufruf enthält.
- Die Objekte sind nicht vom Typ volatile.
- Die Objekte werden zwischen dem setjmp()-Aufruf und dem longjmp()-
Aufruf geändert.
Da der normale Funktionsaufruf und Return-Mechanismus umgangen wird,
wird longjmp() im Zusammenhang mit Interrupts, Signalen und allen die-
sen zugeordneten Funktionen korrekt ausgeführt. Wird longjmp() aller-
dings von einer verschachtelten Routine zur Signalbearbeitung aus auf-
gerufen (das heißt, von einer Funktion, die aufgrund eines Signals
aufgerufen wurde, das während der Bearbeitung eines anderen Signals
aufgetreten ist), ist das Verhalten unbestimmt.
BEISPIELE
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
setjmp(3C) setjmp(3C)
jmpbuf env;
int i = 0;
main ()
{
void exit();
if(setjmp(env) != 0) {
(void) printf("Wert von i bei 2. Rückkehr von setjmp:
%d\n", i);
exit(0);
}
(void) printf("Wert von i bei 1. Rückkehr von setjmp: %d\n", i);
i = 1;
g(); /*NOTREACHED*/
}
g()
{
longjmp(env, 1); /*NOTREACHED*/
}
Wird das sich aus diesem C-Code ergebende a.out ausgeführt, sieht die
Ausgabe folgendermaßen aus:
Wert von i bei 1. Rückkehr von setjmp: 0
Wert von i bei 2. Rückkehr von setjmp: 1
HINWEISE
Anwendungen, deren Verhalten vom Wert der Signalmaske abhängig ist,
sollten die Funktionen longjmp() und setjmp() nicht verwenden, da
deren Auswirkungen auf die Signalmaske unbestimmt sind. Statt dessen
können folgende Alternativen verwendet werden:
- Die Funktionen longjmp() und setjmp() (die die Signalmaske nie-
mals ändern).
- Die Funktionen siglongjmp() und sigsetjmp() (die die Signalmaske
von der Anwendung gesteuert sichern und wiederherstellen können).
Um Fehler und Interrupts in einem Unterprogramm zu untersuchen, ist es
sinnvoller, die Funktion sigsetjmp(3C) zu verwenden.
SIEHE AUCH
signal(2), setjmp(3C-ucb), sigsetjmp(3C).
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98