GENWiki

Premier IT Outsourcing and Support Services within the UK

User Tools

Site Tools


man:setjmp

SETJMP(3) Linux Programmer's Manual SETJMP(3)

NAME

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

SYNOPSIS

     #include <setjmp.h>
     int setjmp(jmp_buf env);
     int sigsetjmp(sigjmp_buf env, int savesigs);
     void longjmp(jmp_buf env, int val);
     void siglongjmp(sigjmp_buf env, int val);
 Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
     setjmp(): see NOTES.
     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
     location 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,  possi-
     bly  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), 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  distin-
     guished 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 |
     +------------------------+---------------+---------+

CONFORMING TO

     setjmp(), longjmp(): POSIX.1-2001, POSIX.1-2008, C89, C99.
     sigsetjmp(), siglongjmp(): POSIX.1-2001, POSIX.1-2008.

NOTES

     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.   On  Linux  with  glibc  versions  before  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.
     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.
     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  follow-
     ing criteria:
     o  they  are local to the function that made the corresponding setjmp()
        call;
     o  their  values  are  changed  between  the  calls  to  setjmp()   and
        longjmp(); and
     o  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
     dynamic target of a particular longjmp() call.  (To make  the  program-
     mer's  life  easier,  each setjmp() call should employ a unique jmp_buf
     variable.)
     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.
 Caveats
     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 han-
     dler 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  unde-
     fined  if  the program subsequently makes a call to a non-async-signal-
     safe function.  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 initial 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)

COLOPHON

     This page is part of release 4.16 of the Linux  man-pages  project.   A
     description  of  the project, information about reporting bugs, and the
     latest    version    of    this    page,    can     be     found     at
     https://www.kernel.org/doc/man-pages/.
                                2017-03-13                         SETJMP(3)
/data/webs/external/dokuwiki/data/pages/man/setjmp.txt · Last modified: 2019/05/17 09:47 by 127.0.0.1

Was this page helpful?-11+1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki