summaryrefslogtreecommitdiffstats
path: root/man2/sigaltstack.2
diff options
context:
space:
mode:
Diffstat (limited to 'man2/sigaltstack.2')
-rw-r--r--man2/sigaltstack.2185
1 files changed, 185 insertions, 0 deletions
diff --git a/man2/sigaltstack.2 b/man2/sigaltstack.2
new file mode 100644
index 000000000..21c4597e5
--- /dev/null
+++ b/man2/sigaltstack.2
@@ -0,0 +1,185 @@
+'\" t
+.\" Copyright (c) 2001, Michael Kerrisk (mtk16@ext.canterbury.ac.nz)
+.\"
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of this
+.\" manual under the conditions for verbatim copying, provided that the
+.\" entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Since the Linux kernel and libraries are constantly changing, this
+.\" manual page may be incorrect or out-of-date. The author(s) assume no
+.\" responsibility for errors or omissions, or for damages resulting from
+.\" the use of the information contained herein.
+.\"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\"
+.\" aeb, various minor fixes
+.TH SIGALTSTACK 2 2001-09-27 "Linux 2.4" "Linux Programmer's Manual"
+.SH NAME
+sigaltstack - set and/or get signal stack context
+.SH SYNOPSIS
+.B #include <signal.h>
+.sp
+.BI "int sigaltstack(const stack_t *" ss ", stack_t *" oss );
+.SH DESCRIPTION
+\fBsigaltstack\fP allows a process to define a new alternate
+signal stack and/or retrieve the state of an existing
+alternate signal stack. An alternate signal stack is used during the
+execution of a signal handler if the establishment of that handler (see
+.BR sigaction (2))
+requested it.
+
+The normal sequence of events for using an alternate signal stack
+is the following:
+.TP
+1.
+Allocate an area of memory to be used for the alternate
+signal stack.
+.TP
+2.
+Use \fBsigaltstack\fP to inform the system of the existence and
+location of the alternate signal stack.
+.TP
+3.
+When establishing a signal handler using \fBsigaction\fP,
+inform the system that the signal handler should be executed
+on the alternate signal stack by
+specifying the \fBSA_ONSTACK\fP flag.
+.P
+The \fIss\fP argument is used to specify a new
+alternate signal stack, while the \fIoss\fP argument
+is used to retrieve information about the currently
+established signal stack.
+If we are interested in performing just one
+of these tasks then the other argument can be specified as NULL.
+Each of these arguments is a structure of the following type:
+.sp
+.RS
+.nf
+typedef struct {
+ void *ss_sp; /* Base address of stack */
+ int ss_flags; /* Flags */
+ size_t ss_size; /* Number of bytes in stack */
+} stack_t;
+.fi
+.RE
+
+To establish a new alternate signal stack,
+\fIss.ss_flags\fP is set to zero, and \fIss.sp_sp\fP and
+\fIss.ss_size\fP specify the starting address and size of
+the stack.
+The constant \fBSIGSTKSZ\fP is defined to be large enough
+to cover the usual size requirements for an alternate signal stack,
+and the constant \fBMINSIGSTKSZ\fP defines the minimum
+size required to execute a signal handler.
+
+To disable an existing stack, specify \fIss.ss_flags\fP
+as \fBSS_DISABLE\fP. In this case, the remaining fields
+in \fIss\fP are ignored.
+
+If \fIoss\fP is not NULL, then it is used to return information about
+the alternate signal stack which was in effect prior to the
+call to \fBsigaltstack\fP.
+The \fIoss.ss_sp\fP and \fIoss.ss_size\fP fields return the starting
+address and size of that stack.
+The \fIoss.ss_flags\fP may return either of the following values:
+
+.TP
+.B SS_ONSTACK
+The process is currently executing on the alternate
+signal stack. (Note that it is not possible
+to change the alternate signal stack if the process is
+currently executing on it.)
+.TP
+.B SS_DISABLE
+The alternate signal stack is currently disabled.
+
+.SH "RETURN VALUE"
+\fBsigaltstack\fP returns 0 on success, or \-1 on failure with
+\fIerrno\fP set to indicate the error.
+
+.SH ERRORS
+.TP
+.B EFAULT
+Either \fIss\fP or \fIoss\fP is not NULL and points to an area
+outside of the process's address space.
+.TP
+.B EINVAL
+\fIss\fP is not NULL and the \fPss_flags\fP field contains
+a non-zero value other than SS_DISABLE.
+.TP
+.B ENOMEM
+The specified size of the new alternate signal stack
+(\fIss.ss_size\fP) was less than \fBMINSTKSZ\fP.
+.TP
+.B EPERM
+An attempt was made to change the alternate signal stack while
+it was active (i.e., the process was already executing
+on the current alternate signal stack).
+.SH NOTES
+The following code segment demonstrates the use of \fBsigaltstack\fP:
+
+.RS
+.nf
+stack_t ss;
+
+ss.ss_sp = malloc(SIGSTKSZ);
+if (ss.ss_sp == NULL)
+ /* Handle error */;
+ss.ss_size = SIGSTKSZ;
+ss.ss_flags = 0;
+if (sigaltstack(&ss, NULL) == -1)
+ /* Handle error */;
+.fi
+.RE
+.P
+Establishing an alternate signal stack is useful if a process
+expects that it may exhaust its standard stack.
+This may occur, for example, because the stack grows so large
+that it encounters the upwardly growing heap, or it reaches a
+limit established by a call to \fBsetrlimit(RLIMIT_STACK, &rlim)\fP.
+If the standard stack is exhausted, the kernel sends
+the process a \fBSIGSEGV\fP signal.
+In these circumstances the only way to catch this signal is
+on an alternate signal stack.
+.P
+On most hardware architectures supported by Linux, stacks grow
+downwards. \fBsigaltstack\fP automatically takes account
+of the direction of stack growth.
+.P
+Functions called from a signal handler executing on an alternate
+signal stack will also use the alternate signal stack.
+(This also applies to any handlers invoked for other signals while
+the process is executing on the alternate signal stack.)
+Unlike the standard stack, the system does not
+automatically extend the alternate signal stack.
+Exceeding the allocated size of the alternate signal stack will
+lead to unpredictable results.
+.P
+A successful call to \fBexecve\fP removes any existing alternate
+signal stack.
+.P
+\fBsigaltstack\fP supersedes the older \fBsigstack\fP call.
+For backwards compatibility, glibc also provides \fBsigstack\fP.
+All new applications should be written using \fBsigaltstack\fB.
+
+.SH HISTORY
+BSD 4.2 had a \fIsigstack\fP() system call. It used a slightly
+different struct, and had as major disadvantage that the caller
+had to know the direction of stack growth.
+
+.SH "CONFORMING TO"
+SUSv2, SVr4, POSIX 1003.1-2001.
+
+.SH "SEE ALSO"
+.BR execve (2),
+.BR setrlimit (2),
+.BR sigaction (2),
+.BR siglongjmp (3),
+.BR sigsetjmp (3),
+.BR signal (7)