setjmp
Nach oben zu setjmp.h - Index
Header-Datei
setjmp.h
Kategorie
Verschiedene Routinen
Prototyp
int setjmp(jmp_buf jmpb);
Beschreibung
Trifft Vorbereitungen für ein nicht lokales goto.
setjmp erfasst in jmpb den vollständigen Task-Status und gibt 0 zurück.
Ein späterer Aufruf von longjmp mit jmpb stellt den erfassten Task-Status wieder her, und die Funktion kehrt dann so zurück, als wäre setjmp mit dem Wert val zurückgekehrt.
Ein Win32-Task-Status umfasst:
- Segmentregister werden nicht gespeichert
- Registervariablen
- EBX, EDI, ESI
- Stack-Zeiger (ESP)
- Frame-Zeiger (EBP)
- Flags werden nicht gespeichert
Ein Task-Status enthält genügend Informationen, dass mit setjmp Unterroutinen implementiert werden können.
setjmp muss vor longjmp aufgerufen werden. Die Routine, die setjmp aufgerufen und jmpb eingerichtet hat, muss aktiv bleiben und darf nicht zurückkehren, bevor longjmp aufgerufen wird. Ist sie zurückgekehrt, ist das Ergebnis nicht vorhersehbar.
setjmp ist für die Behandlung von Fehlern und Exceptions nützlich, die in Low-Level-Routinen eines Programms auftreten könnten.
Rückgabewert
Beim ersten Aufruf gibt setjmp 0 zurück. Kehrt setjmp über einen Aufruf von longjmp, gibt setjmp einen Wert ungleich Null zurück (wie im folgenden Beispiel).
Beispiel
#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>
void subroutine(jmp_buf);
int main(void)
{
int value;
jmp_buf jumper;
value = setjmp(jumper);
if (value != 0)
{
printf("Longjmp with value %d\n", value);
exit(value);
}
printf("About to call subroutine ... \n");
subroutine(jumper);
return 0;
}
void subroutine(jmp_buf jumper)
{
longjmp(jumper,1);
}
Portabilität
POSIX | Win32 | ANSI C | ANSI C++ |
---|---|---|---|
+ |
+ |
+ |
+ |