DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

sigaltstack(S)


sigaltstack -- set or get signal alternate stack context

Syntax

cc . . . -lc
#include <signal.h>

int sigaltstack(const stack_t *ss, stack_t *oss);

Description

sigaltstack allows users to define an alternate stack area on which signals are to be processed. If ss is non-zero, it specifies a pointer to, and the size of a stack area on which to deliver signals, and tells the system if the process is currently executing on that stack. When a signal's action indicates its handler should execute on the alternate signal stack (specified with a sigaction(S) 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 alternate signal stack for the duration of the signal handler's execution.

The structure sigaltstack includes the following members.

   void	*ss_sp
   size_t	ss_size	
   int	ss_flags
If ss is not NULL, it points to a structure specifying the alternate signal stack that will take effect upon return from sigaltstack. The ss_sp and ss_size fields specify the new base and size of the stack, which is automatically adjusted for direction of growth and alignment. The ss_flags field specifies the new stack state and may be set to the following:

SS_DISABLE
The stack is to be disabled and ss_sp and ss_size are ignored. If SS_DISABLE is not set, the stack will be enabled. SS_DISABLE is the only way users can disable the alternate signal stack.
If oss is not NULL, it points to a structure specifying the alternate signal stack that was in effect prior to the call to sigaltstack. The ss_sp and ss_size fields specify the base and size of that stack. The ss_flags field specifies the stack's state, and may contain the following values:

SS_ONSTACK
The process is currently executing on the alternate signal stack. Attempts to modify the alternate signal stack while the process is executing on it will fail. SS_ONSTACK cannot be modified by users.

SS_DISABLE
The alternate signal stack is currently disabled.

Return values

On success, sigaltstack returns 0. On failure, sigaltstack returns -1 and sets errno to identify the error.

Diagnostics

In the following conditions, sigaltstack fails and sets errno to:

[EFAULT]
Either ss or oss points outside the process's allocated address space.

[EINVAL]
ss is non-null and the ss_flags field pointed to by ss contains invalid flags. The only flag considered valid is SS_DISABLE.

[EPERM]
An attempt was made to modify an active stack.

[ENOMEM]
The size of the alternate stack area is less than {MINSIGSTKSZ}.

Examples

The value {SIGSTKSZ} is defined to be the number of bytes that would be used to cover the usual case when allocating an alternate stack area. The value {MINSIGSTKSZ} is defined to be the minimum stack size for a signal handler. In computing an alternate stack size, a program should add that amount to its stack requirements to allow for the operating system overhead.

The following code fragment is typically used to allocate an alternate stack.

   if ((sigstk.ss_sp = malloc(SIGSTKSZ)) == NULL)
   	/* error return */;
   sigstk.ss_size = SIGSTKSZ;
   sigstk.ss_flags = 0;
   if (sigaltstack(&sigstk, (stack_t *)0) < 0)
   	perror("sigaltstack");

Files


/lib/libc.a
linking library

See also

getcontext(S), sigaction(S), signal(M), sigsetjmp(S), ucontext(FP)

Standards conformance

sigaltstack is conformant with:

AT&T SVID Issue 3.


© 2003 Caldera International, Inc. All rights reserved.
SCO OpenServer Release 5.0.7 -- 11 February 2003