2 .\" Copyright (c) 2001, Michael Kerrisk (mtk.manpages@gmail.com)
4 .\" Permission is granted to make and distribute verbatim copies of this
5 .\" manual provided the copyright notice and this permission notice are
6 .\" preserved on all copies.
8 .\" Permission is granted to copy and distribute modified versions of this
9 .\" manual under the conditions for verbatim copying, provided that the
10 .\" entire resulting derived work is distributed under the terms of a
11 .\" permission notice identical to this one.
13 .\" Since the Linux kernel and libraries are constantly changing, this
14 .\" manual page may be incorrect or out-of-date. The author(s) assume no
15 .\" responsibility for errors or omissions, or for damages resulting from
16 .\" the use of the information contained herein. The author(s) may not
17 .\" have taken the same level of care in the production of this manual,
18 .\" which is licensed free of charge, as they might when working
21 .\" Formatted or processed versions of this manual, if unaccompanied by
22 .\" the source, must acknowledge the copyright and authors of this work.
24 .\" aeb, various minor fixes
26 .\" Japanese Version Copyright (c) 2001 Yuichi SATO
27 .\" all rights reserved.
28 .\" Translated 2001-11-04, Yuichi SATO <ysato@h4.dion.ne.jp>
29 .\" Updated 2001-12-09, Yuichi SATO
30 .\" Updated 2005-11-04, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
31 .\" Updated 2006-01-04, Akihiro MOTOKI, Catch up to LDP 2.20
33 .\"WORD: alternate signal stack 代替シグナルスタック
34 .\"WORD: establish (スタックの) 確立
36 .TH SIGALTSTACK 2 2010-09-26 "Linux" "Linux Programmer's Manual"
38 sigaltstack \- シグナルスタックのコンテキストを設定・取得する
40 .B #include <signal.h>
42 .BI "int sigaltstack(const stack_t *" ss ", stack_t *" oss );
46 .RB ( feature_test_macros (7)
54 _BSD_SOURCE || _XOPEN_SOURCE\ >=\ 500 ||
55 _XOPEN_SOURCE\ &&\ _XOPEN_SOURCE_EXTENDED
57 || /* glibc 2.12 以降: */ _POSIX_C_SOURCE\ >=\ 200809L
64 プロセスは新しい代替シグナルスタックを定義したり、
65 既存の代替シグナルスタックの状態を取得できる。
66 シグナルハンドラが代替シグナルスタックを要求するように設定されていると
68 参照)、ハンドラの実行中はそのシグナルスタックが使われる。
70 代替シグナルスタックを使う際の一般的な手順は、以下の通りである:
73 代替シグナルスタックで使うメモリ領域を確保する。
78 代替シグナルスタックの存在と場所をシステムに知らせる。
83 \fBSA_ONSTACK\fP フラグを指定することにより、
84 そのシグナルハンドラを代替シグナルスタック上で実行することを
87 \fIss\fP 引き数は、新しいシグナルスタックを指定するために使う。
88 また \fIoss\fP 引き数は、現在確立されている
89 シグナルスタックの情報を取得するために使う。
90 この操作のうち 1 つだけを実行させるには、
91 使用しない引き数を NULL に指定すればよい。
92 引き数となる構造体は、以下のような型である:
97 void *ss_sp; /* スタックのベースアドレス */
98 int ss_flags; /* フラグ */
99 size_t ss_size; /* スタックのバイト数 */
104 新規の代替シグナルスタックを確立するには、
105 \fIss.ss_flags\fP を 0 に設定し、
106 \fIss.ss_sp\fP と \fIss.ss_size\fP に
107 スタックの開始アドレスとスタックサイズを指定する。
108 定数 \fBSIGSTKSZ\fP は、代替シグナルスタックが通常必要する
110 また定数 \fBMINSIGSTKSZ\fP は、
111 シグナルハンドラの実行に必要な最小サイズに定義されている。
113 代替スタックでシグナルハンドラが起動された場合には、
114 カーネルにより自動的に、\fIss.ss_sp\fP で指定されたアドレスは
115 動作しているハードウェアアーキテクチャに適したアドレス境界に
119 \fIss.ss_flags\fP を \fBSS_DISABLE\fP に指定する。
120 この場合、\fIss\fP の他のフィールドは無視される。
122 \fIoss\fP が NULL 以外の場合、
123 \fIoss\fP に代替シグナルスタックの情報が返される。
127 \fIoss.ss_sp\fP と \fIoss.ss_size\fP フィールドに
128 スタックの開始アドレスとスタックサイズが返される。
129 \fIoss.ss_flags\fP には以下のどちらかの値が返される:
132 プロセスが代替シグナルスタック上で実行されている
133 (プロセスが既にそのシグナルスタック上で実行されている場合は、
134 それと同じシグナルスタックには変更できない点に注意すること)。
137 代替シグナルスタックが現在無効になっている。
142 エラーを示す値に \fIerrno\fP を設定する。
146 \fIss\fP または \fIoss\fP のどちらが、NULL 以外で、
147 かつプロセスのアドレス空間の外を指している。
150 \fIss\fP が NULL 以外で、\fIss_flags\fP フィールドが
155 新しい代替シグナルスタック (\fIss.ss_size\fP) に指定したサイズが
156 \fBMINSTKSZ\fP より小さい。
159 代替シグナルスタックが有効であるときに変更を行おうとした
160 (つまり、プロセスが既に現在の代替シグナルスタック上で実行されていた)。
162 SUSv2, SVr4, POSIX.1-2001.
164 代替シグナルスタックを使用する最もよくある場面は、
168 はプロセスの通常のスタックが利用できる空間が使い果たされた際に
171 用のシグナルハンドラをプロセスのスタック上では起動することができない。
172 そのため、このシグナルを扱おうとする場合には、
173 代替シグナルスタックを使用しなければならない。
175 プロセスが標準のシグナルスタックを使い果たすことが予想される場合は、
176 代替シグナルスタックを確立すると便利である。
178 下位アドレス方向に非常にたくさん積まれてしまうことで、
179 最下位アドレスから上位アドレス方向に積まれるヒープとぶつかってしまう場合や、
180 \fBsetrlimit(RLIMIT_STACK, &rlim)\fP の呼び出しで確立された
181 制限に達してしまった場合に、この様な事が起こる。
183 カーネルはプロセスに \fBSIGSEGV\fP シグナルを送る。
184 このような状況では、代替シグナルスタック上でしかシグナルをキャッチできない。
186 Linux がサポートする多くのハードウェアアーキテクチャでは、
189 はスタックが積まれる方向を自動的に決定する。
192 シグナルハンドラから呼ばれる関数も、代替シグナルハンドラを使う
193 (プロセスが代替シグナルスタック上で実行されている場合、
194 他のシグナルで呼び出されるハンドラもこの代替シグナルハンドラを使う)。
196 システムは代替シグナルスタックを自動的に拡張しない。
197 代替シグナルスタック用に確保したサイズを越えた場合、
202 既存の全ての代替シグナルスタックが削除される。
204 経由で作成された子プロセスは、親プロセスの代替シグナルスタックの
211 過去プログラムとの互換性のため、glibc では
221 この関数は少し異なった構造体を使っており、
222 呼び出した側がスタックの積まれる方向を知っていなければならないという
233 ss.ss_sp = malloc(SIGSTKSZ);
234 if (ss.ss_sp == NULL)
236 ss.ss_size = SIGSTKSZ;
238 if (sigaltstack(&ss, NULL) == \-1)