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


   #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)):

       see NOTES.
   sigsetjmp(): _POSIX_C_SOURCE


   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
   establishes 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
   environment (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

   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
   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.


   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.


   For   an   explanation   of   the  terms  used  in  this  section,  see

   Interface                Attribute      Value   
   setjmp(), sigsetjmp()    Thread safety  MT-Safe 
   longjmp(), siglongjmp()  Thread safety  MT-Safe 


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

   sigsetjmp(), siglongjmp(): POSIX.1-2001, POSIX.1-2008.


   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 text  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
   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
   control  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
   readability 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
   following criteria:

   *  they  are local to the function that made the corresponding setjmp()

   *  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
   dynamic  target  of  a  particular  longjmp()  call.   (To   make   the
   programmer'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.

   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
   recommends 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 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-
      signal-safe  functions  are  called after returning from the initial
      call to main().




   This page is part of release 4.09 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

                              2016-10-08                         SETJMP(3)

More Linux Commands

Mail::SpamAssassin::Message::Metadata(3pm) - extract metadat
This class is tasked with extracting metadata from messages for use as Bayes tokens, fodder for eval tests, or other rules. Metadata is supplemental data inferr

item_opts_off(3menu) - set and get menu item options........
The function set_item_opts sets all the given items option bits (menu option bits may be logically-ORed together). The function item_opts_on turns on the given

yes(1) - output a string repeatedly until killed (Man Page)
Repeatedly output a line with all specified STRING(s), or y. --help display this help and exit --version output version information and exit GNU coreutils onlin

gnutls_x509_crl_get_issuer_dn_by_oid(3) - API function......
This function will extract the part of the name of the CRL issuer specified by the given OID. The output will be encoded as described in RFC2253. The output str

place(n) - Geometry manager for fixed or rubber-sheet placem
The placer is a geometry manager for Tk. It provides simple fixed placement of windows, where you specify the exact size and location of one window, called the

rindex(3) - locate character in string - Linux manual page
The index() function returns a pointer to the first occurrence of the character c in the string s. The rindex() function returns a pointer to the last occurrenc

ppmdcfont(1) - Turn a Ppmdfont file into C source for a buil
This program is part of Netpbm(1) (There are no arguments or options) ppmdcfont creates a C source file that you can compile into a built-in font for use with t

Tcl_UniCharIsPrint(3) - routines for classification of Tcl_U
All of the routines described examine Tcl_UniChars and return a boolean value. A non-zero return value means that the character does belong to the character cla

pickup(8) - Postfix local mail pickup - Linux manual page...
The pickup(8) daemon waits for hints that new mail has been dropped into the maildrop directory, and feeds it into the cleanup(8) daemon. Ill-formatted files ar

stat(1) - display file or file system status (Man Page).....
Display file or file system status. Mandatory arguments to long options are mandatory for short options too. -L, --dereference follow links -f, --file-system di

XDeviceTimeCoord(3) - get device motion history (Man Page)
The server may retain the recent history of the device motion and do so to a finer granularity than is reported by DeviceMotionNotify events. The XGetDeviceMoti

glutSetKeyRepeat(3) - retrieves simple GLUT state represente
XXX fix me SEE ALSO glutIgnoreKeyRepeat, glutKeyboardFunc, glutSpecialFunc, glutKeyboardUpFunc, glutSpecialUpFunc, glutDeviceGet AUTHOR Mark J. Kilgard (mjk@nvi

We can't live, work or learn in freedom unless the software we use is free.