sigstack(3) (BSD Compatibility Package) sigstack(3)
NAME
sigstack - set and/or get signal stack context
SYNOPSIS
/usr/ucb/cc [flag ...] file ... -lucb
#include <signal.h>
int sigstack(struct sigstack *ss, struct sigstack *oss);
DESCRIPTION
sigstack allows users to define an alternate stack, called the signal
stack, on which signals are to be processed. When a signal's action
indicates its handler should execute on the signal stack (specified
with a sigvec(3) call), the system checks to see if the process is
currently executing on that stack. If the process is not currently
executing on the signal stack, the system arranges a switch to the
signal stack for the duration of the signal handler's execution.
A signal stack is specified by a sigstack structure, which includes
the following members:
char *sssp; /* signal stack pointer */
int ssonstack; /* current status */
sssp is the initial value to be assigned to the stack pointer when
the system switches the process to the signal stack. On machines where
the stack grows downwards in memory, this is not the address of the
beginning of the signal stack area. ssonstack field is zero or non-
zero depending on whether the process is currently executing on the
signal stack or not.
If ss is not a NULL pointer, sigstack sets the signal stack state to
the value in the sigstack structure pointed to by ss. If ssonstack is
non-zero, the system will think that the process is executing on the
signal stack. If ss is a NULL pointer, the signal stack state will be
unchanged. If oss is not a NULL pointer, the current signal stack
state is stored in the sigstack structure pointed to by oss.
After a successful call to one of the exec functions, there are no
alternate signal stacks in the new process image.
RETURN VALUE
Upon successful completion, a value of 0 is returned. Otherwise, a
value of -1 is returned and errno is set to indicate the error.
Page 1 Reliant UNIX 5.44 Printed 11/98
sigstack(3) (BSD Compatibility Package) sigstack(3)
DIAGNOSTICS
sigstack fails and the signal stack context remains unchanged.
EFAULT Either ss or oss points to memory that is not a valid part
of the process address space.
EPERM An attempt was made to modify an active stack.
NOTES
Signal stacks are not grown automatically, as is done for the normal
stack. If the stack overflows unpredictable results may occur.
A portable application, when being written or rewritten, should use
sigaltstack() instead of sigstack().
On some implementations, stack space is automatically extended as
needed. On those implementations, automatic extension is typically not
available for an alternate stack. If a signal stack overflows, the
resulting behavior of the process is undefined.
The direction of stack growth is not indicated in the historical
definition of struct sigstack. The only way to portably establish a
stack pointer is for the application to determine stack growth direc-
tion, or to allocate a block of storage and set the stack pointer to
the middle. The implementation may assume that the size of the signal
stack is SIGSTKSZ as found in <signal.h>. An implementation that would
like to specify a signal stack size other than SIGSTKSZ should use
sigaltstack().
Programs should not use longjmp() to leave a signal handler that is
running on a stack established with sigstack(). Doing so may disable
future use of the signal stack. For abnormal exit from a signal
handler, siglongjmp(), setcontext(), or swapcontext() may be used.
These functions fully support switching from one stack to another.
The sigstack() function requires the application to have knowledge of
the underlying system's stack architecture. For this reason,
sigaltstack() is recommended over this function.
SEE ALSO
exec(2), fork(2), sigaltstack(2), signal(2), sigvec(3), signal(3-ucb),
setjmp(3C), sigsetjmp(3C), signal(5).
Page 2 Reliant UNIX 5.44 Printed 11/98