2 .\" Copyright (c) 2001, 2017 Michael Kerrisk <mtk.manpages@gmail.com>
4 .\" SPDX-License-Identifier: Linux-man-pages-copyleft
6 .\" aeb, various minor fixes
7 .TH sigaltstack 2 (date) "Linux man-pages (unreleased)"
9 sigaltstack \- set and/or get signal stack context
12 .RI ( libc ", " \-lc )
15 .B #include <signal.h>
17 .BI "int sigaltstack(const stack_t *_Nullable restrict " ss ,
18 .BI " stack_t *_Nullable restrict " old_ss );
22 Feature Test Macro Requirements for glibc (see
23 .BR feature_test_macros (7)):
29 .\" || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
30 || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
31 || /* glibc <= 2.19: */ _BSD_SOURCE
35 allows a thread to define a new alternate
36 signal stack and/or retrieve the state of an existing
37 alternate signal stack.
38 An alternate signal stack is used during the
39 execution of a signal handler if the establishment of that handler (see
43 The normal sequence of events for using an alternate signal stack
47 Allocate an area of memory to be used for the alternate
53 to inform the system of the existence and
54 location of the alternate signal stack.
57 When establishing a signal handler using
59 inform the system that the signal handler should be executed
60 on the alternate signal stack by
61 specifying the \fBSA_ONSTACK\fP flag.
63 The \fIss\fP argument is used to specify a new
64 alternate signal stack, while the \fIold_ss\fP argument
65 is used to retrieve information about the currently
66 established signal stack.
67 If we are interested in performing just one
68 of these tasks, then the other argument can be specified as NULL.
72 type used to type the arguments of this function is defined as follows:
77 void *ss_sp; /* Base address of stack */
78 int ss_flags; /* Flags */
79 size_t ss_size; /* Number of bytes in stack */
84 To establish a new alternate signal stack,
85 the fields of this structure are set as follows:
88 This field contains either 0, or the following flag:
91 .BR SS_AUTODISARM " (since Linux 4.7)"
92 .\" commit 2a74213838104a41588d86fd5e8d344972891ace
93 .\" See tools/testing/selftests/sigaltstack/sas.c in kernel sources
94 Clear the alternate signal stack settings on entry to the signal handler.
95 When the signal handler returns,
96 the previous alternate signal stack settings are restored.
98 This flag was added in order to make it safe
99 to switch away from the signal handler with
101 Without this flag, a subsequently handled signal will corrupt
102 the state of the switched-away signal handler.
103 On kernels where this flag is not supported,
107 when this flag is supplied.
111 This field specifies the starting address of the stack.
112 When a signal handler is invoked on the alternate stack,
113 the kernel automatically aligns the address given in \fIss.ss_sp\fP
114 to a suitable address boundary for the underlying hardware architecture.
117 This field specifies the size of the stack.
118 The constant \fBSIGSTKSZ\fP is defined to be large enough
119 to cover the usual size requirements for an alternate signal stack,
120 and the constant \fBMINSIGSTKSZ\fP defines the minimum
121 size required to execute a signal handler.
123 To disable an existing stack, specify \fIss.ss_flags\fP
125 In this case, the kernel ignores any other flags in
127 and the remaining fields
130 If \fIold_ss\fP is not NULL, then it is used to return information about
131 the alternate signal stack which was in effect prior to the
134 The \fIold_ss.ss_sp\fP and \fIold_ss.ss_size\fP fields return the starting
135 address and size of that stack.
136 The \fIold_ss.ss_flags\fP may return either of the following values:
139 The thread is currently executing on the alternate signal stack.
140 (Note that it is not possible
141 to change the alternate signal stack if the thread is
142 currently executing on it.)
145 The alternate signal stack is currently disabled.
147 Alternatively, this value is returned if the thread is currently
148 executing on an alternate signal stack that was established using the
151 In this case, it is safe to switch away from the signal handler with
153 It is also possible to set up a different alternative signal stack
154 using a further call to
156 .\" FIXME Was it intended that one can set up a different alternative
157 .\" signal stack in this scenario? (In passing, if one does this, the
158 .\" sigaltstack(NULL, &old_ss) now returns old_ss.ss_flags==SS_AUTODISARM
159 .\" rather than old_ss.ss_flags==SS_DISABLE. The API design here seems
163 The alternate signal stack has been marked to be autodisarmed
170 as a non-NULL value, one can obtain the current settings for
171 the alternate signal stack without changing them.
174 returns 0 on success, or \-1 on failure with
175 \fIerrno\fP set to indicate the error.
179 Either \fIss\fP or \fIold_ss\fP is not NULL and points to an area
180 outside of the process's address space.
183 \fIss\fP is not NULL and the \fIss_flags\fP field contains
187 The specified size of the new alternate signal stack
193 An attempt was made to change the alternate signal stack while
194 it was active (i.e., the thread was already executing
195 on the current alternate signal stack).
197 For an explanation of the terms used in this section, see
205 Interface Attribute Value
208 T} Thread safety MT-Safe
217 is a Linux extension.
219 POSIX.1-2001, SUSv2, SVr4.
221 The most common usage of an alternate signal stack is to handle the
223 signal that is generated if the space available for the
224 standard stack is exhausted: in this case, a signal handler for
226 cannot be invoked on the standard stack; if we wish to handle it,
227 we must use an alternate signal stack.
229 Establishing an alternate signal stack is useful if a thread
230 expects that it may exhaust its standard stack.
231 This may occur, for example, because the stack grows so large
232 that it encounters the upwardly growing heap, or it reaches a
233 limit established by a call to \fBsetrlimit(RLIMIT_STACK, &rlim)\fP.
234 If the standard stack is exhausted, the kernel sends
235 the thread a \fBSIGSEGV\fP signal.
236 In these circumstances the only way to catch this signal is
237 on an alternate signal stack.
239 On most hardware architectures supported by Linux, stacks grow
242 automatically takes account
243 of the direction of stack growth.
245 Functions called from a signal handler executing on an alternate
246 signal stack will also use the alternate signal stack.
247 (This also applies to any handlers invoked for other signals while
248 the thread is executing on the alternate signal stack.)
249 Unlike the standard stack, the system does not
250 automatically extend the alternate signal stack.
251 Exceeding the allocated size of the alternate signal stack will
252 lead to unpredictable results.
256 removes any existing alternate
258 A child process created via
260 inherits a copy of its parent's alternate signal stack settings.
261 The same is also true for a child process created using
263 unless the clone flags include
267 in which case any alternate signal stack that was established in the parent
268 is disabled in the child process.
274 For backward compatibility, glibc also provides
276 All new applications should be written using
283 different struct, and had the major disadvantage that the caller
284 had to know the direction of stack growth.
286 In Linux 2.2 and earlier, the only flag that could be specified
291 In the lead up to the release of the Linux 2.4 kernel,
293 .\" After quite a bit of web and mail archive searching,
294 .\" I could not find the patch on any mailing list, and I
295 .\" could find no place where the rationale for this change
297 a change was made to allow
300 .I ss.ss_flags==SS_ONSTACK
301 with the same meaning as
303 (i.e., the inclusion of
308 On other implementations, and according to POSIX.1,
310 appears only as a reported flag in
311 .IR old_ss.ss_flags .
312 On Linux, there is no need ever to specify
316 and indeed doing so should be avoided on portability grounds:
317 various other systems
318 .\" See the source code of Illumos and FreeBSD, for example.
324 The following code segment demonstrates the use of
328 to install an alternate signal stack that is employed by a handler
337 ss.ss_sp = malloc(SIGSTKSZ);
338 if (ss.ss_sp == NULL) {
343 ss.ss_size = SIGSTKSZ;
345 if (sigaltstack(&ss, NULL) == \-1) {
346 perror("sigaltstack");
350 sa.sa_flags = SA_ONSTACK;
351 sa.sa_handler = handler(); /* Address of a signal handler */
352 sigemptyset(&sa.sa_mask);
353 if (sigaction(SIGSEGV, &sa, NULL) == \-1) {