![]() |
![]() |
![]() |
Restore the environment saved by setjmp()
#include <setjmp.h> void longjmp( jmp_buf env, int return_value );
libc
The longjmp() function restores the environment saved in env by the most recent call to the setjmp() function.
![]() |
Using longjmp() to jump out of a signal handler can cause unpredictable behavior, unless the signal was generated by the raise() function. |
After the longjmp() function restores the environment, program execution continues as if the corresponding call to setjmp() had just returned the value specified by return_value. If the value of return_value is 0, the value returned is 1.
#include <stdio.h> #include <stdlib.h> #include <setjmp.h> jmp_buf env; void rtn( void ) { printf( "about to longjmp\n" ); longjmp( env, 14 ); } int main( void ) { int ret_val = 293; if( 0 == ( ret_val = setjmp( env ) ) ) { printf( "after setjmp %d\n", ret_val ); rtn(); printf( "back from rtn %d\n", ret_val ); } else { printf( "back from longjmp %d\n", ret_val ); } return EXIT_SUCCESS; }
produces the following output:
after setjmp 0 about to longjmp back from longjmp 14
Safety: | |
---|---|
Cancellation point | No |
Interrupt handler | No |
Signal handler | Yes |
Thread | Yes |
A strictly-conforming POSIX application cannot assume that the longjmp() function is signal-safe on other platforms.
![]() |
Don't use longjmp() or siglongjmp() to restore an environment saved by a call to setjmp() or sigsetjmp() in another thread. If you're lucky, your application will crash; if not, it'll look as if it works for a while, until random scribbling on the stack causes it to crash. |
setjmp(), siglongjmp(), sigsetjmp()
![]() |
![]() |
![]() |