Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

cc(1)

setjmp(3C)

signal(2)

signal(3BSD)

sigsetmask(3BSD)

sigvec(3BSD)






       setjmp(3BSD)         (BSD System Compatibility)         setjmp(3BSD)


       NAME
             setjmp, longjmp, _setjmp, _longjmp, sigsetjmp, siglongjmp -
             (BSD) non-local goto

       SYNOPSIS
             /usr/ucb/cc [flag . . . ] file . . .
             #include <setjmp.h>
             int setjmp(jmp_buf env);
             longjmp(jmp_buf env, int val);
             int _setjmp(jmp_buf env);
             _longjmp(jmp_buf env, int val);
             int sigsetjmp(sigjmp_buf env, int savemask);
             siglongjmp(sigjmp_buf env, int val);

       DESCRIPTION
             setjmp and longjmp are useful for dealing with errors and
             interrupts encountered in a low-level subroutine of a program.

             setjmp saves its stack environment in env for later use by
             longjmp.  A normal call to setjmp returns zero.  setjmp also
             saves the register environment.  If a longjmp call will be
             made, the routine which called setjmp should not return until
             after the longjmp has returned control (see below).

             longjmp restores the environment saved by the last call of
             setjmp, and then returns in such a way that execution
             continues as if the call of setjmp had just returned the value
             val to the function that invoked setjmp; however, if val were
             zero, execution would continue as if the call of setjmp had
             returned one.  This ensures that a ``return'' from setjmp
             caused by a call to longjmp can be distinguished from a
             regular return from setjmp.  The calling function must not
             itself have returned in the interim, otherwise longjmp will be
             returning control to a possibly non-existent environment.  All
             memory-bound data have values as of the time longjmp was
             called.  The CPU and floating-point data registers are
             restored to the values they had at the time that setjmp was
             called.  But, because the register storage class is only a
             hint to the C compiler, variables declared as register
             variables may not necessarily be assigned to machine
             registers, so their values are unpredictable after a longjmp.
             This is especially a problem for programmers trying to write
             machine-independent C routines.





                           Copyright 1994 Novell, Inc.               Page 1













      setjmp(3BSD)         (BSD System Compatibility)         setjmp(3BSD)


            setjmp and longjmp save and restore the signal mask (see
            sigsetmask(3BSD)), while _setjmp and _longjmp manipulate only
            the C stack and registers.  If the savemask flag to sigsetjmp
            is non-zero, the signal mask is saved, and a subsequent
            siglongjmp using the same env will restore the signal mask.
            If the savemask flag is zero, the signal mask is not saved,
            and a subsequent siglongjmp using the same env will not
            restore the signal mask.  In all other ways, _setjmp and
            sigsetjmp function in the same way that setjmp does, and
            _longjmp and siglongjmp function in the same way that longjmp
            does.

            None of these functions save or restore any floating-point
            status or control registers.

      EXAMPLE
            The following code fragment indicates the flow of control of
            the setjmp and longjmp combination:
                  function declaration
                  ...
                        jmp_buf     my_environment;
                        ...
                        if (setjmp(my_environment))  {
                          /* register variables have unpredictable values */
                              code after the return from longjmp
                              ...
                        } else {
                          /* do not modify register vars in this leg of code */
                              this is the return from setjmp
                              ...
                        }

      REFERENCES
            cc(1), setjmp(3C), signal(2), signal(3BSD), sigsetmask(3BSD),
            sigvec(3BSD)

      NOTICES
            setjmp does not save the current notion of whether the process
            is executing on the signal stack.  The result is that a
            longjmp to some place on the signal stack leaves the signal
            stack state incorrect.

            On some systems setjmp also saves the register environment.
            Therefore, all data that are bound to registers are restored
            to the values they had at the time that setjmp was called.
            All memory-bound data have values as of the time longjmp was


                          Copyright 1994 Novell, Inc.               Page 2













       setjmp(3BSD)         (BSD System Compatibility)         setjmp(3BSD)


             called.  However, because the register storage class is only a
             hint to the C compiler, variables declared as register
             variables may not necessarily be assigned to machine
             registers, so their values are unpredictable after a longjmp.
             When using compiler options that specify automatic register
             allocation [see cc(1)], the compiler will not attempt to
             assign variables to registers in routines that call setjmp.

             longjmp never causes setjmp to return zero, so programmers
             should not depend on longjmp being able to cause setjmp to
             return zero.





































                           Copyright 1994 Novell, Inc.               Page 3








Typewritten Software • bear@typewritten.org • Edmonds, WA 98026