setjmp(3) Library Functions Manual setjmp(3)
NAME
setjmp, sigsetjmp, longjmp, siglongjmp - performing a nonlocal goto
LIBRARY
Standard C library (libc, -lc)
SYNOPSIS
#include <setjmp.h>
int setjmp(jmp_buf env);
int sigsetjmp(sigjmp_buf env, int savesigs);
[[noreturn]] void longjmp(jmp_buf env, int val);
[[noreturn]] void siglongjmp(sigjmp_buf env, int val);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
setjmp(): see HISTORY.
sigsetjmp():
_POSIX_C_SOURCE
DESCRIPTION
The functions described on this page are used for performing "nonlocal
gotos": transferring execution from one function to a predetermined lo-
cation in another function. The setjmp() function dynamically estab-
lishes the target to which control will later be transferred, and
longjmp() performs the transfer of execution.
The setjmp() function saves various information about the calling envi-
ronment (typically, the stack pointer, the instruction pointer, possibly
the values of other registers and the signal mask) in the buffer env for
later use by longjmp(). In this case, setjmp() returns 0.
The longjmp() function uses the information saved in env to transfer
control back to the point where setjmp() was called and to restore
("rewind") the stack to its state at the time of the setjmp() call. In
addition, and depending on the implementation (see NOTES and HISTORY),
the values of some other registers and the process signal mask may be
restored to their state at the time of the setjmp() call.
Following a successful longjmp(), execution continues as if setjmp() had
returned for a second time. This "fake" return can be distinguished
from a true setjmp() call because the "fake" return returns the value
provided in val. If the programmer mistakenly passes the value 0 in
val, the "fake" return will instead return 1.
sigsetjmp() and siglongjmp()
sigsetjmp() and siglongjmp() also perform nonlocal gotos, but provide
predictable handling of the process signal mask.
If, and only if, the savesigs argument provided to sigsetjmp() is
nonzero, the process's current signal mask is saved in env and will be
restored if a siglongjmp() is later performed with this env.
RETURN VALUE
setjmp() and sigsetjmp() return 0 when called directly; on the "fake"
return that occurs after longjmp() or siglongjmp(), the nonzero value
specified in val is returned.
The longjmp() or siglongjmp() functions do not return.
ATTRIBUTES
For an explanation of the terms used in this section, see attributes(7).
┌────────────────────────────────────────────┬───────────────┬─────────┐
│ Interface │ Attribute │ Value │
├────────────────────────────────────────────┼───────────────┼─────────┤
│ setjmp(), sigsetjmp() │ Thread safety │ MT-Safe │
├────────────────────────────────────────────┼───────────────┼─────────┤
│ longjmp(), siglongjmp() │ Thread safety │ MT-Safe │
└────────────────────────────────────────────┴───────────────┴─────────┘
STANDARDS
setjmp()
longjmp()
C11, POSIX.1-2008.
sigsetjmp()
siglongjmp()
POSIX.1-2008.
HISTORY
setjmp()
longjmp()
POSIX.1-2001, C89.
sigsetjmp()
siglongjmp()
POSIX.1-2001.
POSIX does not specify whether setjmp() will save the signal mask (to be
later restored during longjmp()). In System V it will not. In 4.3BSD
it will, and there is a function _setjmp() that will not. The behavior
under Linux depends on the glibc version and the setting of feature test
macros. Before glibc 2.19, setjmp() follows the System V behavior by
default, but the BSD behavior is provided if the _BSD_SOURCE feature
test macro is explicitly defined and none of _POSIX_SOURCE,
_POSIX_C_SOURCE, _XOPEN_SOURCE, _GNU_SOURCE, or _SVID_SOURCE is defined.
Since glibc 2.19, <setjmp.h> exposes only the System V version of
setjmp(). Programs that need the BSD semantics should replace calls to
setjmp() with calls to sigsetjmp() with a nonzero savesigs argument.
NOTES
setjmp() and longjmp() can be useful for dealing with errors inside
deeply nested function calls or to allow a signal handler to pass con-
trol to a specific point in the program, rather than returning to the
point where the handler interrupted the main program. In the latter
case, if you want to portably save and restore signal masks, use
sigsetjmp() and siglongjmp(). See also the discussion of program read-
ability below.
CAVEATS
The compiler may optimize variables into registers, and longjmp() may
restore the values of other registers in addition to the stack pointer
and program counter. Consequently, the values of automatic variables
are unspecified after a call to longjmp() if they meet all the following
criteria:
• they are local to the function that made the corresponding setjmp()
call;
• their values are changed between the calls to setjmp() and longjmp();
and
• they are not declared as volatile.
Analogous remarks apply for siglongjmp().
Nonlocal gotos and program readability
While it can be abused, the traditional C "goto" statement at least has
the benefit that lexical cues (the goto statement and the target label)
allow the programmer to easily perceive the flow of control. Nonlocal
gotos provide no such cues: multiple setjmp() calls might employ the
same jmp_buf variable so that the content of the variable may change
over the lifetime of the application. Consequently, the programmer may
be forced to perform detailed reading of the code to determine the dy-
namic target of a particular longjmp() call. (To make the programmer's
life easier, each setjmp() call should employ a unique jmp_buf vari-
able.)
Adding further difficulty, the setjmp() and longjmp() calls may not even
be in the same source code module.
In summary, nonlocal gotos can make programs harder to understand and
maintain, and an alternative should be used if possible.
Undefined Behavior
If the function which called setjmp() returns before longjmp() is
called, the behavior is undefined. Some kind of subtle or unsubtle
chaos is sure to result.
If, in a multithreaded program, a longjmp() call employs an env buffer
that was initialized by a call to setjmp() in a different thread, the
behavior is undefined.
POSIX.1-2008 Technical Corrigendum 2 adds longjmp() and siglongjmp() to
the list of async-signal-safe functions. However, the standard recom-
mends avoiding the use of these functions from signal handlers and goes
on to point out that if these functions are called from a signal handler
that interrupted a call to a non-async-signal-safe function (or some
equivalent, such as the steps equivalent to exit(3) that occur upon a
return from the initial call to main()), the behavior is undefined if
the program subsequently makes a call to a non-async-signal-safe func-
tion. The only way of avoiding undefined behavior is to ensure one of
the following:
• After long jumping from the signal handler, the program does not call
any non-async-signal-safe functions and does not return from the ini-
tial call to main().
• Any signal whose handler performs a long jump must be blocked during
every call to a non-async-signal-safe function and no non-async-sig-
nal-safe functions are called after returning from the initial call
to main().
SEE ALSO
signal(7), signal-safety(7)
Linux man-pages 6.9.1 2024-06-16 setjmp(3)
Generated by dwww version 1.16 on Tue Dec 16 04:02:10 CET 2025.