setjmp(3C-ucb) (BSD Compatibility Package) setjmp(3C-ucb)
NAME
setjmp, longjmp, setjmp, longjmp - Nichtlokaler Sprung
SYNTAX
/usr/ucb/cc [flag ...] file ... -lucb
#include <setjmp.h>
int setjmp(jmpbuf env);
longjmp(jmpbuf env, int val);
int setjmp(jmpbuf env);
longjmp(jmpbuf env, int val);
BESCHREIBUNG
setjmp und longjmp bieten sich für die Bearbeitung von Fehlern und
Interrupts an, die in einer Low-Level-Subroutine eines Programms auf-
treten.
setjmp sichert die Stack-Umgebung in env für eine spätere Verwendung
durch longjmp. Ein normaler Aufruf von setjmp gibt Null aus. setjmp
sichert ferner die Registerumgebung. Wenn longjmp aufgerufen wird,
darf die Routine, die setjmp aufgerufen hat, erst wieder zurückkehren,
nachdem longjmp die Steuerung wieder zurückgegeben hat (siehe unten).
longjmp stellt die durch den letzten Aufruf von setjmp gesicherte
Umgebung wieder her, und setzt die Ausführung fort, als hätte der Auf-
ruf von setjmp gerade den Wert val an die Funktion zurückgegeben,
durch die setjmp aufgerufen wurde; wenn val gleich Null ist, würde die
Ausführung allerdings so fortgesetzt, als hätte der Aufruf von setjmp
den Wert Eins zurückgegeben. Hierdurch wird sichergestellt, daß eine
durch den Aufruf von longjmp hervorgerufene Rückkehr von setjmp von
der regulären Rückkehr von setjmp unterschieden werden kann. Die auf-
rufende Funktion darf in der Zwischenzeit nicht selbst zurückgekehrt
sein, da longjmp andernfalls die Steuerung an eine möglicherweise
nicht existierende Umgebung übergibt. Alle speichergebundenen Daten
haben die Werte, die sie zum Zeitpunkt des Aufrufs von longjmp hatten.
Die CPU- und Gleitkommadatenregister werden wieder auf die Werte
zurückgesetzt, die sie zur Zeit des Aufrufs von setjmp hatten. Da die
Speicherklasse register allerdings nur als Hinweis für den C-Compiler
dient, werden als register-Variablen deklarierte Variablen nicht unbe-
dingt den Rechnerregistern zugeordnet, so daß deren Werte nach einem
Aufruf von longjmp unvorhersehbar sind. Dies ist besonders dann ein
Problem, wenn der Programmierer rechnerunabhängige C-Routinen schrei-
ben will.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
setjmp(3C-ucb) (BSD Compatibility Package) setjmp(3C-ucb)
Die Funktionen longjmp() und setjmp() entsprechen den Funktionen
longjmp() beziehungsweise setjmp(), nur mit der zusätzlichen Ein-
schränkung, daß longjmp() und setjmp() die Signalmaske nicht manipu-
lieren.
Wenn longjmp() aufgerufen wird, obwohl env niemals durch einen Aufruf
von setjmp() initialisiert wurde, oder wenn sich der letzte
setjmp()-Aufruf in einer mittlerweile zurückgekehrten Funktion befin-
det, sind die Ergebnisse nicht definiert.
Diese Funktionen sichern weder Gleitkommastatus oder Steuerregister
noch stellen sie diese wieder her.
BEISPIELE
Das folgende Code-Fragment zeigt den Steuerfluß aus der Kombination
von setjmp und longjmp:
function declaration
...
jmpbuf myenvironment;
...
if (setjmp(myenvironment)) {
/* register variables have unpredictable values */
code after the return from longjmp
...
} else {
/* do not modify register vars in this leg of code */
this is the return from setjmp
...
}
ANWENDUNGSZWECK
Wenn longjmp() ausgeführt wird, und die Umgebung, in der setjmp()
ausgeführt wurde, nicht mehr existiert, können Fehler auftreten.
Bedingungen, unter denen die Umgebung von setjmp() nicht mehr exi-
stiert, sind unter anderem das Verlassen der Funktion, die den
setjmp()-Aufruf enthält, sowie das Verlassen eines inneren Blocks mit
temporärem Speicher. Diese Bedingung ist unter Umständen nicht fest-
stellbar; in diesem Fall wird ein longjmp() ausgeführt und wenn die
Umgebung nicht mehr existiert, ist der Inhalt des temporären Speichers
eines inneren Blocks unvorhersehbar. Diese Bedingung kann auch zu
einem unerwarteten Prozeßende führen. Wenn die Funktion zurückkehrt,
sind die Ergebnisse nicht definiert.
Wird longjmp() ein Zeiger auf einen nicht durch setjmp() erstellten
Puffer, longjmp() ein Zeiger auf einen nicht durch setjmp() erstell-
ten Puffer oder siglongjmp() ein Zeiger auf einen nicht durch
sigsetjmp() erstellten Puffer übergeben, oder wird einer dieser drei
Funktionen ein Puffer übergeben, der durch den Benutzer geändert
wurde, können alle oben genannten und noch weitere Probleme auftreten.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
setjmp(3C-ucb) (BSD Compatibility Package) setjmp(3C-ucb)
Die Funktionen longjmp() und setjmp() sind zur Unterstützung von
Programmen aufgenommen, die für frühere Systemschnittstellen geschrie-
ben wurden. Neuere Anwendungen sollten die Funktionen siglongjmp()
beziehungsweise sigsetjmp() verwenden.
FEHLER
setjmp sichert keine Angaben darüber, ob der Prozeß im Signal-Stack
ausgeführt wird. Hieraus ergibt sich, daß ein longjmp auf manche Stel-
len im Signal-Stack den Status des Signal-Stacks nicht korrekt hinter-
läßt.
Auf einigen Systemen sichert setjmp auch die Registerumgebung. Daher
werden alle registergebundenen Daten auf die Werte zurückgesetzt, die
sie beim Aufruf von setjmp hatten. Alle speichergebundenen Daten haben
Werte, die denen zur Zeit des Aufrufs von longjmp entsprechen. Da die
Speicherklasse register allerdings nur als Hinweis für den C-Compiler
dient, werden als register-Variablen deklarierte Variablen nicht unbe-
dingt den Rechnerregistern zugeordnet, so daß deren Werte nach einem
Aufruf von longjmp unvorhersehbar sind. Bei Verwendung von Compiler-
Optionen mit automatischer Registerzuordnung [siehe cc(1)] versucht
der Compiler nicht, Registern in Routinen, die setjmp aufrufen, Varia-
blen zuzuordnen.
longjmp veranlaßt setjmp niemals dazu, den Wert Null zurückzugeben.
SIEHE AUCH
cc(1), signal(2), sigsetmask(3), sigvec(3), signal(3-ucb), setjmp(3C).
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98