longjmp()
ist nur zusammen mit setjmp()
anwendbar: Der Aufruf von longjmp()
bewirkt, dass das Programm an eine zuvor mit setjmp()
gespeicherte Stelle verzweigt. Im Unterschied zu goto
-Sprüngen, die nur innerhalb derselben Funktion (also lokal) zulässig sind, erlaubt longjmp
Sprünge von einer beliebigen Funktion in eine andere, noch aktive Funktion (nicht lokale Sprünge).
setjmp()
speichert die aktuelle Prozessumgebung (Adresse im C-Laufzeitstack, Befehlszähler, Registerinhalte) in eine Variable vom Typ jmp_buf
(siehe setjmp.h
). longjmp()
stellt die durch setjmp()
gesicherte Prozessumgebung wieder her, und der Prozess wird mit der Anweisung fortgesetzt, die unmittelbar auf den setjmp-
Aufruf folgt.
Wenn es vor dem longjmp
-Aufruf keinen setjmp
-Aufruf gab oder wenn die Funktion, die den Aufruf von setjmp()
enthält, inzwischen ihre Ausführung beendet hat, ist das Verhalten undefiniert.
env ist der Vektor, in den setjmp()
seine Werte abgelegt hat (siehe setjmp.h
).
val ist eine ganze Zahl, die bei der Rückkehr des Prozesses als Returnwert des setjmp
-Aufrufs interpretiert wird. Wenn val gleich 0 ist, liefert setjmp()
den Wert 1 zurück; 0 würde bedeuten, dass an die Stelle nach dem setjmp
-Aufruf „normal“, d.h. nicht mit longjmp()
verzweigt wurde (siehe auch setjmp()
).
Alle zugreifbaren Objekte besitzen die Werte, die sie zum Zeitpunkt des Aufrufs von llongjmp()
besaßen, mit Ausnahme der Werte von automatischen Objekten. Diese sind unter folgenden Bedingungen undefiniert:
- Sie sind lokal zu der Funktion, die den entsprechenden
setjmp
-Aufruf enthält. - Sie sind nicht vom Typ
volatile
. - Sie wurden zwischen dem
setjmp
- und dem longjmp
-Aufruf geändert.
Da longjmp()
den üblichen Funktionsaufruf- und Rückkehrmechanismus umgeht, arbeitet longjmp()
im Zusammenhang mit Unterbrechungen, Signalen und den zugehörigen Funktionen korrekt. Trotzdem ist das Verhalten undefiniert, wenn longjmp()
von einer geschachtelten Signalbehandlungsfunktion aus aufgerufen wird (d.h. von einer Funktion aus, die als Ergebnis eines Signals während der Behandlung eines anderen Signals aufgerufen wurde).
Nach der Beendigung von longjmp()
setzt die Programmausführung fort, als ob der entsprechende Aufruf von setjmp()
soeben den durch val angegebenen Wert geliefert hätte.
longjmp()
kann setjmp()
nicht veranlassen, den Wert 0 zurückzugeben. Wenn val gleich 0 ist, gibt setjmp()
1 zurück.
Das Ergebnis eines Aufrufs dieser Funktion ist undefiniert, wenn die Struktur jmp_buf
nicht im aufrufenden Thread initialisiert wurde.
Die Struktur jmp_buf muss durch setjmp() initialisiert werden. Bei Threads kommt dazu, dass dies im selben Thread passieren muss.