Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

longjmp - nichtlokalen Sprung ausführen

&pagelevel(4)&pagelevel

Definition

#include <setjmp.h>

void longjmp(jmp_buf env, int val);

Beschreibung

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.

Hinweis

Nicht lokale Sprünge sind nützlich bei der Unterbrechungsbehandlung (siehe signal()).
Erfolgt z.B. die Behandlung von Fehlern oder Unterbrechungen in Routinen auf niedriger Stufe (d.h. es sind eine Reihe zuvor aufgerufener Funktionen noch aktiv), lässt sich mit longjmp() und setjmp() die normale Abarbeitung der noch aktiven Funktionen umgehen und sofort zu einer Funktion auf höherer Ebene verzweigen. Ein longjmp-Aufruf aus einer Unterbrechungs- oder Fehlerroutine leert die Einträge im Laufzeitstack bis zu der durch setjmp() markierten Stelle, d.h. alle bis dahin noch aktiven Funktionen auf niedrigerer Ebene sind nicht mehr aktiv und das Programm wird auf höherer Ebene fortgesetzt.

Beim Wiederaufsetzen der Programmausführung sind die Variablen wie nach einem goto belegt: Globale Variablen haben die Werte, die sie zum Zeitpunkt des longjmp-Aufrufs hatten. Register- und sonstige lokale Variablen sind undefiniert, d.h. sie sollten überprüft und ggf. neu belegt werden.

Siehe auch

setjmp(), sigaction(), siglongjmp(), sigsetjmp(), setjmp.h.