NAME
sigsetjmp
,
siglongjmp
, setjmp
,
longjmp
, _setjmp
,
_longjmp
—
non-local jumps
SYNOPSIS
#include
<setjmp.h>
int
sigsetjmp
(sigjmp_buf
env, int
savemask);
void
siglongjmp
(sigjmp_buf
env, int val);
int
setjmp
(jmp_buf
env);
void
longjmp
(jmp_buf
env, int val);
int
_setjmp
(jmp_buf
env);
void
_longjmp
(jmp_buf
env, int val);
DESCRIPTION
The
sigsetjmp
(),
setjmp
(), and
_setjmp
()
functions save their calling environment in env. Each
of these functions returns 0.
The corresponding
longjmp
()
functions restore the environment saved by the most recent invocation of the
respective setjmp
() function. They then return so
that program execution continues as if the corresponding invocation of the
setjmp
() call had just returned the value specified
by val, instead of 0. The value specified by
val must be non-zero; a 0 value is treated as 1 to
allow the programmer to differentiate between a direct invocation of
setjmp
() and a return via
longjmp
().
Pairs of calls may be intermixed; i.e., both
sigsetjmp
()
and
siglongjmp
()
as well as setjmp
() and
longjmp
() combinations may be used in the same
program. However, individual calls may not — e.g., the
env argument to setjmp
() may
not be passed to siglongjmp
().
The
longjmp
()
routines may not be called after the routine which called the
setjmp
() routines returns.
All accessible objects have values as of the time
the
longjmp
()
routine was called, except that the values of objects of automatic storage
invocation duration that do not have the volatile type
and have been changed between the setjmp
()
invocation and longjmp
() call are indeterminate.
The
setjmp
()/longjmp
()
function pairs save and restore the signal mask while the
_setjmp
()/_longjmp
()
function pairs save and restore only the register set and the stack (see
sigprocmask(2)).
The
sigsetjmp
()/siglongjmp
()
function pairs save and restore the signal mask if the argument
savemask is non-zero. Otherwise, only the register set
and the stack are saved.
In other words,
setjmp
()/longjmp
()
are functionally equivalent to
sigsetjmp
()/siglongjmp
()
when sigsetjmp
() is called with a non-zero
savemask argument. Conversely,
_setjmp
()/_longjmp
() are
functionally equivalent to
sigsetjmp
()/siglongjmp
()
when sigsetjmp
() is called with a zero-value
savemask.
The
sigsetjmp
()/siglongjmp
()
interfaces are preferred for maximum portability.
SEE ALSO
STANDARDS
The setjmp
() and
longjmp
() functions conform to ANSI
X3.159-1989 (“ANSI C89”). The
sigsetjmp
() and siglongjmp
()
functions conform to IEEE Std 1003.1-1990
(“POSIX.1”).
HISTORY
The setjmp
() and
longjmp
() functions first appeared in the
Programmer's Workbench (PWB/UNIX).
CAVEATS
Historically, on AT&T System V
UNIX, the
setjmp
()/longjmp
() functions
have been equivalent to the BSD
_setjmp
()/_longjmp
()
functions and do not restore the signal mask. Because of this discrepancy,
the sigsetjmp
()/siglongjmp
()
interfaces should be used if portability is desired.
Use of longjmp
() or
siglongjmp
() from inside a signal handler is not as
easy as it might seem. Generally speaking, all possible code paths between
the setjmp
() and longjmp
()
must be signal race safe, as discussed in
signal(3).
Furthermore, the code paths must not do resource management (such as
open(2) or
close(2))
without blocking the signal in question, or resources might be mismanaged.
Obviously this makes longjmp
() much less useful than
previously thought.