1setjmp(3)                  Library Functions Manual                  setjmp(3)
2
3
4

NAME

6       setjmp, sigsetjmp, longjmp, siglongjmp  - performing a nonlocal goto
7

LIBRARY

9       Standard C library (libc, -lc)
10

SYNOPSIS

12       #include <setjmp.h>
13
14       int setjmp(jmp_buf env);
15       int sigsetjmp(sigjmp_buf env, int savesigs);
16
17       [[noreturn]] void longjmp(jmp_buf env, int val);
18       [[noreturn]] void siglongjmp(sigjmp_buf env, int val);
19
20   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
21
22       setjmp(): see NOTES.
23
24       sigsetjmp():
25           _POSIX_C_SOURCE
26

DESCRIPTION

28       The  functions described on this page are used for performing "nonlocal
29       gotos": transferring execution from one function to a predetermined lo‐
30       cation  in  another function.  The setjmp() function dynamically estab‐
31       lishes the target to which  control  will  later  be  transferred,  and
32       longjmp() performs the transfer of execution.
33
34       The setjmp() function saves various information about the calling envi‐
35       ronment (typically, the stack pointer, the instruction pointer,  possi‐
36       bly  the  values  of other registers and the signal mask) in the buffer
37       env for later use by longjmp().  In this case, setjmp() returns 0.
38
39       The longjmp() function uses the information saved in  env  to  transfer
40       control  back  to  the  point  where setjmp() was called and to restore
41       ("rewind") the stack to its state at the time of the setjmp() call.  In
42       addition,  and  depending on the implementation (see NOTES), the values
43       of some other registers and the process signal mask may be restored  to
44       their state at the time of the setjmp() call.
45
46       Following  a  successful  longjmp(), execution continues as if setjmp()
47       had returned for a second time.  This  "fake"  return  can  be  distin‐
48       guished from a true setjmp() call because the "fake" return returns the
49       value provided in val.  If the programmer mistakenly passes the value 0
50       in val, the "fake" return will instead return 1.
51
52   sigsetjmp() and siglongjmp()
53       sigsetjmp()  and  siglongjmp() also perform nonlocal gotos, but provide
54       predictable handling of the process signal mask.
55
56       If, and only if, the savesigs argument provided to sigsetjmp() is  non‐
57       zero, the process's current signal mask is saved in env and will be re‐
58       stored if a siglongjmp() is later performed with this env.
59

RETURN VALUE

61       setjmp() and sigsetjmp() return 0 when called directly; on  the  "fake"
62       return  that  occurs after longjmp() or siglongjmp(), the nonzero value
63       specified in val is returned.
64
65       The longjmp() or siglongjmp() functions do not return.
66

ATTRIBUTES

68       For an  explanation  of  the  terms  used  in  this  section,  see  at‐
69       tributes(7).
70
71       ┌────────────────────────────────────────────┬───────────────┬─────────┐
72Interface                                   Attribute     Value   
73       ├────────────────────────────────────────────┼───────────────┼─────────┤
74setjmp(), sigsetjmp()                       │ Thread safety │ MT-Safe │
75       ├────────────────────────────────────────────┼───────────────┼─────────┤
76longjmp(), siglongjmp()                     │ Thread safety │ MT-Safe │
77       └────────────────────────────────────────────┴───────────────┴─────────┘
78

STANDARDS

80       setjmp()
81       longjmp()
82              C11, POSIX.1-2008.
83
84       sigsetjmp()
85       siglongjmp()
86              POSIX.1-2008.
87

HISTORY

89       setjmp()
90       longjmp()
91              POSIX.1-2001, C89.
92
93       sigsetjmp()
94       siglongjmp()
95              POSIX.1-2001.
96
97       POSIX  does  not specify whether setjmp() will save the signal mask (to
98       be later restored during longjmp()).  In System  V  it  will  not.   In
99       4.3BSD  it  will, and there is a function _setjmp() that will not.  The
100       behavior under Linux depends on the glibc version and  the  setting  of
101       feature  test macros.  Before glibc 2.19, setjmp() follows the System V
102       behavior  by  default,  but  the  BSD  behavior  is  provided  if   the
103       _BSD_SOURCE  feature  test  macro  is  explicitly  defined  and none of
104       _POSIX_SOURCE,   _POSIX_C_SOURCE,   _XOPEN_SOURCE,   _GNU_SOURCE,    or
105       _SVID_SOURCE is defined.  Since glibc 2.19, <setjmp.h> exposes only the
106       System V version of setjmp().  Programs that  need  the  BSD  semantics
107       should  replace calls to setjmp() with calls to sigsetjmp() with a non‐
108       zero savesigs argument.
109

NOTES

111       setjmp() and longjmp() can be useful for  dealing  with  errors  inside
112       deeply  nested function calls or to allow a signal handler to pass con‐
113       trol to a specific point in the program, rather than returning  to  the
114       point  where  the  handler interrupted the main program.  In the latter
115       case, if you want to  portably  save  and  restore  signal  masks,  use
116       sigsetjmp() and siglongjmp().  See also the discussion of program read‐
117       ability below.
118

CAVEATS

120       The compiler may optimize variables into registers, and  longjmp()  may
121       restore  the values of other registers in addition to the stack pointer
122       and program counter.  Consequently, the values of  automatic  variables
123       are  unspecified after a call to longjmp() if they meet all the follow‐
124       ing criteria:
125
126       •  they are local to the function that made the corresponding  setjmp()
127          call;
128
129       •  their   values  are  changed  between  the  calls  to  setjmp()  and
130          longjmp(); and
131
132       •  they are not declared as volatile.
133
134       Analogous remarks apply for siglongjmp().
135
136   Nonlocal gotos and program readability
137       While it can be abused, the traditional C "goto" statement at least has
138       the benefit that lexical cues (the goto statement and the target label)
139       allow the programmer to easily perceive the flow of control.   Nonlocal
140       gotos  provide  no  such cues: multiple setjmp() calls might employ the
141       same jmp_buf variable so that the content of the  variable  may  change
142       over the lifetime of the application.  Consequently, the programmer may
143       be forced to perform detailed reading of the code to determine the  dy‐
144       namic target of a particular longjmp() call.  (To make the programmer's
145       life easier, each setjmp() call should employ a  unique  jmp_buf  vari‐
146       able.)
147
148       Adding  further  difficulty,  the  setjmp() and longjmp() calls may not
149       even be in the same source code module.
150
151       In summary, nonlocal gotos can make programs harder to  understand  and
152       maintain, and an alternative should be used if possible.
153
154   Undefined Behavior
155       If  the  function  which  called  setjmp()  returns before longjmp() is
156       called, the behavior is undefined.  Some kind  of  subtle  or  unsubtle
157       chaos is sure to result.
158
159       If,  in a multithreaded program, a longjmp() call employs an env buffer
160       that was initialized by a call to setjmp() in a different  thread,  the
161       behavior is undefined.
162
163       POSIX.1-2008 Technical Corrigendum 2 adds longjmp() and siglongjmp() to
164       the list of async-signal-safe functions.  However, the standard  recom‐
165       mends avoiding the use of these functions from signal handlers and goes
166       on to point out that if these functions are called from a  signal  han‐
167       dler  that  interrupted  a call to a non-async-signal-safe function (or
168       some equivalent, such as the steps equivalent to exit(3) that occur up‐
169       on a return from the initial call to main()), the behavior is undefined
170       if the program subsequently makes a  call  to  a  non-async-signal-safe
171       function.  The only way of avoiding undefined behavior is to ensure one
172       of the following:
173
174       •  After long jumping from the signal handler,  the  program  does  not
175          call  any  non-async-signal-safe  functions and does not return from
176          the initial call to main().
177
178       •  Any signal whose handler performs a long jump must be blocked during
179          every call to a non-async-signal-safe function and no non-async-sig‐
180          nal-safe functions are called after returning from the initial  call
181          to main().
182

SEE ALSO

184       signal(7), signal-safety(7)
185
186
187
188Linux man-pages 6.04              2023-03-30                         setjmp(3)
Impressum