Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

setjmp - Marke für nichtlokalen Sprung setzen

&pagelevel(4)&pagelevel

Definition

#include <setjmp.h>

int setjmp(jmp_buf env);

Beschreibung

setjmp() sichert die aktuelle Aufrufumgebung (Adresse im C-Laufzeitstack, Befehlszähler, Registerinhalte) im Argument env für eine spätere Verwendung durch die Funktion longjmp(). Im POSIX-Subsystem ist setjmp() als Makro implementiert. In anderen X/Open-konformen Systemen kann setjmp() als Funktion implementiert sein.

Wenn eine Makrodefinition unterdrückt wird, um auf eine vorhandene Funktion zugreifen zu können oder ein Programm oder einen externen Bezeichner mit dem Namen setjmp definiert, ist das Verhalten undefiniert.

setjmp() ist nur zusammen mit der Funktion longjmp() sinnvoll: Mit diesen beiden Funktionen lassen sich nichtlokale Sprünge realisieren, d.h. Sprünge von einer beliebigen Funktion in eine andere, noch aktive Funktion. Ein longjmp-Aufruf richtet die von ssetjmp() gespeicherte Aufrufumgebung wieder ein und setzt die Programmausführung anschließend fort (siehe auch longjmp()).

env ist das Feld, in das setjmp() den aktuellen Programmzustand speichert. Der Typ jmp_buf ist in setjmp.h definiert.

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.

setjmp() sollte nur in folgenden Zusammenhängen aufgerufen werden:

  • als vollständiger Bedingungsausdruck einer Auswahl- oder Schleifenanweisung, z.B.

    if (setjmp(env)) ...

  • als Operand eines Vergleichsoperators, wobei der andere Operand ein konstanter ganzzahliger Ausdruck und der Gesamtausdruck der vollständige Bedingungsausdruck einer Auswahl- oder Schleifenanweisung ist, z.B.

    if (setjmp(env) == 0) ...

  • als Operand des einstelligen Operators !, wobei der Gesamtausdruck der vollständige Bedingungsausdruck einer Auswahl- oder Schleifenanweisung ist, z.B.

    if (!setjmp(env)) ...

  • als vollständiger Ausdruck einer Ausdrucksanweisung, ggf. umgewandelt in den Typ void:

    (void)setjmp(env);

Returnwert

0     

bei erfolgreicher Rückkehr eines unmittelbaren sigset-Aufrufs.


!= 0

wenn die Rückkehr von einem longjmp-Aufruf erfolgt. Der Returnwert entspricht in diesem Falle dem Wert des Arguments val des longjmp-Aufrufs.

Hinweis

Im Allgemeinen ist sigsetjmp() geeigneter als setjmp() zur Behandlung von Fehlern und Signalen, die in Low-Level-Unterprogrammen auftreten.

Siehe auch

longjmp(), sigsetjmp(), setjmp.h