Namensräume
Varianten
Aktionen

longjmp

Von cppreference.com
Definiert im Header <setjmp.h>
void longjmp( jmp_buf env, int status );
(bis C11)
_Noreturn void longjmp( jmp_buf env, int status );
(seit C11)
(bis C23)
[[noreturn]] void longjmp( jmp_buf env, int status );
(seit C23)

Lädt den von einem früheren Aufruf von setjmp gespeicherten Ausführungskontext env. Diese Funktion kehrt nicht zurück. Die Kontrolle wird an die Aufrufstelle des Makros setjmp übertragen, das env eingerichtet hat. Dieses setjmp gibt dann den Wert zurück, der als status übergeben wurde.

Wenn die Funktion, die setjmp aufgerufen hat, beendet wurde (entweder durch Rückgabe oder durch einen anderen longjmp weiter oben im Stack), ist das Verhalten undefiniert. Mit anderen Worten, nur Sprünge im Aufruf-Stack sind erlaubt.

Ein Sprung zwischen Threads (wenn die Funktion, die setjmp aufgerufen hat, von einem anderen Thread ausgeführt wurde) ist ebenfalls undefiniertes Verhalten.

(seit C11)

Wenn zum Zeitpunkt des Aufrufs von setjmp eine VLA oder eine andere variabel modifizierte Typvariablen im Geltungsbereich war und die Kontrolle diesen Geltungsbereich verlassen hat, ruft longjmp zu diesem setjmp undefiniertes Verhalten hervor, selbst wenn die Kontrolle innerhalb der Funktion verblieben ist.

Auf dem Weg nach oben im Stack deallokiert longjmp keine VLAs; Speicherlecks können auftreten, wenn ihre Lebenszeiten auf diese Weise beendet werden.

void g(int n)
{
    int a[n]; // a may remain allocated
    h(n); // does not return
}
void h(int n)
{
    int b[n]; // b may remain allocated
    longjmp(buf, 2); // might cause a memory leak for h's b and g's a
}
(seit C99)

Inhalt

[bearbeiten] Parameter

env - Variable, die den von setjmp gespeicherten Ausführungszustand des Programms referenziert
status - der Wert, der von setjmp zurückgegeben werden soll. Wenn er gleich 0 ist, wird stattdessen 1 verwendet.

[bearbeiten] Rückgabewert

(keine)

[bearbeiten] Hinweise

longjmp ist für die Handhabung unerwarteter Fehlerbedingungen vorgesehen, bei denen die Funktion nicht sinnvoll zurückkehren kann. Dies ähnelt der Ausnahmebehandlung in anderen Programmiersprachen.

[bearbeiten] Beispiel

#include <stdio.h>
#include <setjmp.h>
#include <stdnoreturn.h>
 
jmp_buf my_jump_buffer;
 
noreturn void foo(int status) 
{
    printf("foo(%d) called\n", status);
    longjmp(my_jump_buffer, status + 1); // will return status+1 out of setjmp
}
 
int main(void)
{
    volatile int count = 0; // modified local vars in setjmp scope must be volatile
    if (setjmp(my_jump_buffer) != 5) // compare against constant in an if
        foo(++count);
}

Ausgabe

foo(1) called
foo(2) called
foo(3) called
foo(4) called

[bearbeiten] Referenzen

  • C17-Standard (ISO/IEC 9899:2018)
  • 7.13.2.1 Das longjmp-Makro (S. 191-192)
  • C11-Standard (ISO/IEC 9899:2011)
  • 7.13.2.1 Das longjmp-Makro (S. 263-264)
  • C99-Standard (ISO/IEC 9899:1999)
  • 7.13.2.1 Das longjmp-Makro (S. 244-245)
  • C89/C90-Standard (ISO/IEC 9899:1990)
  • 4.6.2.1 Die longjmp-Funktion

[bearbeiten] Siehe auch

speichert den Kontext
(Makro-Funktion) [bearbeiten]
C++-Dokumentation für longjmp