Standards / Extensions | C or C++ | Dependencies |
---|---|---|
ISO C |
both |
#include <setjmp.h>
int setjmp(jmp_buf env);
Saves a stack environment that can subsequently be restored by longjmp(). The setjmp() and longjmp() functions provide a way to perform a nonlocal goto. They are often used in signal handlers.
A call to setjmp() causes it to save the current stack environment in env. A subsequent call to longjmp() restores the saved environment and returns control to a point corresponding to the setjmp() call. The values of all variables, except register variables and nonvolatile automatic variables, accessible to the function receiving control, contain the values they had when longjmp() was called. The values of register variables are unpredictable. Nonvolatile auto variables that are changed between calls to setjmp() and longjmp() are also unpredictable.
Special behavior for POSIX C: To save and restore a stack environment that includes a signal mask, use sigsetjmp() and siglongjmp(), instead of setjmp().
The sigsetjmp()—siglongjmp() pair, the setjmp()—longjmp() pair, the _setjmp()—_longjmp() pair, and the getcontext()—setcontext() pair cannot be intermixed. A stack environment saved by setjmp() can only be restored by longjmp().
Special behavior for C++: If setjmp() and longjmp() are used to transfer control in a z/OS® XL C++ program, the behavior in terms of the destruction of automatic objects is undefined. This applies both to z/OS XL C++ and z/OS XL C/C++ ILC modules. The use of setjmp() and longjmp() in conjunction with try(), catch(), and throw() is also undefined.
Special behavior for XPG4.2: In a program that was compiled with the feature test macro _XOPEN_SOURCE_EXTENDED defined, another pair of functions, _setjmp()—_longjmp(), are available. On this implementation, these calls are functionally identical to setjmp()—longjmp(). Therefore it is possible, but not recommended, to intermix the setjmp()—longjmp() pair with the _setjmp()—_longjmp() pair.
setjmp() returns 0 after saving the stack environment.
If setjmp() returns as a result of a longjmp() call, it returns the value argument of longjmp(), or the value 1 if the value argument of longjmp() is equal to 0.
if(setjmp(mark) != 0) …
When the system first performs the if statement, it saves the environment in mark and sets the condition to FALSE because setjmp() returns 0 when it saves the environment. The program prints the message: setjmp has been called.
/* This example shows the effect of having set the stack environment. */
#include <stdio.h>
#include <setjmp.h>
jmp_buf mark;
void p(void);
void recover(void);
int main(void)
{
if (setjmp(mark) != 0) {
printf("longjmp has been called\n");
recover();
exit(1);
}
printf("setjmp has been called\n");
⋮
p();
⋮
}
void p(void)
{
int error = 0;
⋮
error = 9;
⋮
if (error != 0)
longjmp(mark, -1);
⋮
}
void recover(void)
{
⋮
}