setjmp.h is a header defined in the C standard library to provide "non-local jumps": control flow that deviates from the usual subroutine call and return sequence. The complementary functions setjmp
and longjmp
provide this functionality.
A typical use of setjmp
/longjmp
is implementation of an exception mechanism that exploits the ability of longjmp
to reestablish program or thread state, even across multiple levels of function calls. A less common use of setjmp
is to create syntax similar to coroutines.
setjmp
saves the current environment (the program state), at some point of program execution, into a platform-specific data structure (jmp_buf
) that can be used at some later point of program execution by longjmp
to restore the program state to that saved by setjmp
into jmp_buf
. This process can be imagined to be a "jump" back to the point of program execution where setjmp
saved the environment. The (apparent) return value from setjmp
indicates whether control reached that point normally (zero) or from a call to longjmp
(nonzero). This leads to a common idiom: if( setjmp(x) ){/* handle longjmp(x) */}
.
POSIX.1 does not specify whether setjmp
and longjmp
save and restore the current set of blocked signals; if a program employs signal handling it should use POSIX's sigsetjmp
/siglongjmp
.
The C99 Rationale describes jmp_buf
as being an array type for backward compatibility; existing code refers to jmp_buf
storage locations by name (without the &
address-of operator), which is only possible for array types.
When a "non-local goto" is executed via setjmp
/longjmp
, normal "stack unwinding" does not occur. Therefore any required cleanup actions will not occur either. This could include closing file descriptors, flushing buffers, or freeing heap-allocated memory.