OSDN Git Service

(split) LDP: Update the version to 3.53 in PO files
[linuxjm/LDP_man-pages.git] / draft / man2 / sigaltstack.2
1 .\" t
2 .\" Copyright (c) 2001, Michael Kerrisk (mtk.manpages@gmail.com)
3 .\"
4 .\" %%%LICENSE_START(VERBATIM)
5 .\" Permission is granted to make and distribute verbatim copies of this
6 .\" manual provided the copyright notice and this permission notice are
7 .\" preserved on all copies.
8 .\"
9 .\" Permission is granted to copy and distribute modified versions of this
10 .\" manual under the conditions for verbatim copying, provided that the
11 .\" entire resulting derived work is distributed under the terms of a
12 .\" permission notice identical to this one.
13 .\"
14 .\" Since the Linux kernel and libraries are constantly changing, this
15 .\" manual page may be incorrect or out-of-date.  The author(s) assume no
16 .\" responsibility for errors or omissions, or for damages resulting from
17 .\" the use of the information contained herein.  The author(s) may not
18 .\" have taken the same level of care in the production of this manual,
19 .\" which is licensed free of charge, as they might when working
20 .\" professionally.
21 .\"
22 .\" Formatted or processed versions of this manual, if unaccompanied by
23 .\" the source, must acknowledge the copyright and authors of this work.
24 .\" %%%LICENSE_END
25 .\"
26 .\" aeb, various minor fixes
27 .\"*******************************************************************
28 .\"
29 .\" This file was generated with po4a. Translate the source file.
30 .\"
31 .\"*******************************************************************
32 .TH SIGALTSTACK 2 2010\-09\-26 Linux "Linux Programmer's Manual"
33 .SH 名前
34 sigaltstack \- シグナルスタックのコンテキストを設定・取得する
35 .SH 書式
36 \fB#include <signal.h>\fP
37 .sp
38 \fBint sigaltstack(const stack_t *\fP\fIss\fP\fB, stack_t *\fP\fIoss\fP\fB);\fP
39 .sp
40 .in -4n
41 glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7)  参照):
42 .in
43 .sp
44 \fBsigaltstack\fP():
45 .ad l
46 .RS 4
47 .PD 0
48 _BSD_SOURCE || _XOPEN_SOURCE\ >=\ 500 || _XOPEN_SOURCE\ &&\ _XOPEN_SOURCE_EXTENDED
49 .br
50 || /* glibc 2.12 以降: */ _POSIX_C_SOURCE\ >=\ 200809L
51 .PD
52 .RE
53 .ad
54 .SH 説明
55 \fBsigaltstack\fP()  を使うと、 プロセスは新しい代替シグナルスタックを定義したり、 既存の代替シグナルスタックの状態を取得できる。
56 シグナルハンドラが代替シグナルスタックを要求するように設定されていると (\fBsigaction\fP(2)
57 参照)、ハンドラの実行中はそのシグナルスタックが使われる。
58
59 代替シグナルスタックを使う際の一般的な手順は、以下の通りである:
60 .TP  3
61 1.
62 代替シグナルスタックで使うメモリ領域を確保する。
63 .TP 
64 2.
65 \fBsigaltstack\fP()  を使って、 代替シグナルスタックの存在と場所をシステムに知らせる。
66 .TP 
67 3.
68 \fBsigaction\fP(2)  を使ってシグナルハンドラを確立する際、 \fBSA_ONSTACK\fP フラグを指定することにより、
69 そのシグナルハンドラを代替シグナルスタック上で実行することを システムに知らせる。
70 .P
71 \fIss\fP 引き数は、新しいシグナルスタックを指定するために使う。 また \fIoss\fP 引き数は、現在確立されている
72 シグナルスタックの情報を取得するために使う。 この操作のうち 1 つだけを実行させるには、 使用しない引き数を NULL に指定すればよい。
73 引き数となる構造体は、以下のような型である:
74 .sp
75 .in +4n
76 .nf
77 typedef struct {
78     void  *ss_sp;     /* スタックのベースアドレス */
79     int    ss_flags;  /* フラグ */
80     size_t ss_size;   /* スタックのバイト数 */
81 } stack_t;
82 .fi
83 .in
84
85 新規の代替シグナルスタックを確立するには、 \fIss.ss_flags\fP を 0 に設定し、 \fIss.ss_sp\fP と \fIss.ss_size\fP に
86 スタックの開始アドレスとスタックサイズを指定する。 定数 \fBSIGSTKSZ\fP は、代替シグナルスタックが通常必要する
87 サイズよりも充分大きく定義されている。 また定数 \fBMINSIGSTKSZ\fP は、 シグナルハンドラの実行に必要な最小サイズに定義されている。
88
89 代替スタックでシグナルハンドラが起動された場合には、 カーネルにより自動的に、\fIss.ss_sp\fP で指定されたアドレスは
90 動作しているハードウェアアーキテクチャに適したアドレス境界に 調整される。
91
92 既存のスタックを無効にするには、 \fIss.ss_flags\fP を \fBSS_DISABLE\fP に指定する。 この場合、\fIss\fP
93 の他のフィールドは無視される。
94
95 \fIoss\fP が NULL 以外の場合、 \fIoss\fP に代替シグナルスタックの情報が返される。 これは (実質的に)
96 \fBsigaltstack\fP()  の呼び出しより先に行われる。 \fIoss.ss_sp\fP と \fIoss.ss_size\fP フィールドに
97 スタックの開始アドレスとスタックサイズが返される。 \fIoss.ss_flags\fP には以下のどちらかの値が返される:
98 .TP 
99 \fBSS_ONSTACK\fP
100 プロセスが代替シグナルスタック上で実行されている (プロセスが既にそのシグナルスタック上で実行されている場合は、
101 それと同じシグナルスタックには変更できない点に注意すること)。
102 .TP 
103 \fBSS_DISABLE\fP
104 代替シグナルスタックが現在無効になっている。
105 .SH 返り値
106 \fBsigaltstack\fP()  は成功した場合 0 を返す。 失敗した場合は \-1 を返して、 エラーを示す値に \fIerrno\fP を設定する。
107 .SH エラー
108 .TP 
109 \fBEFAULT\fP
110 \fIss\fP または \fIoss\fP のどちらが、NULL 以外で、 かつプロセスのアドレス空間の外を指している。
111 .TP 
112 \fBEINVAL\fP
113 \fIss\fP が NULL 以外で、\fIss_flags\fP フィールドが \fBSS_DISABLE\fP 以外の 0 でない値になっている。
114 .TP 
115 \fBENOMEM\fP
116 新しい代替シグナルスタック (\fIss.ss_size\fP) に指定したサイズが \fBMINSTKSZ\fP より小さい。
117 .TP 
118 \fBEPERM\fP
119 代替シグナルスタックが有効であるときに変更を行おうとした (つまり、プロセスが既に現在の代替シグナルスタック上で実行されていた)。
120 .SH 準拠
121 SUSv2, SVr4, POSIX.1\-2001.
122 .SH 注意
123 代替シグナルスタックを使用する最もよくある場面は、 \fBSIGSEGV\fP シグナルを扱うときである。 \fBSIGSEGV\fP
124 はプロセスの通常のスタックが利用できる空間が使い果たされた際に 生成されるシグナルである。この場合には、 \fBSIGSEGV\fP
125 用のシグナルハンドラをプロセスのスタック上では起動することができない。 そのため、このシグナルを扱おうとする場合には、
126 代替シグナルスタックを使用しなければならない。
127 .P
128 プロセスが標準のシグナルスタックを使い果たすことが予想される場合は、 代替シグナルスタックを確立すると便利である。 例えば、スタックが最上位アドレスから
129 下位アドレス方向に非常にたくさん積まれてしまうことで、 最下位アドレスから上位アドレス方向に積まれるヒープとぶつかってしまう場合や、
130 \fBsetrlimit(RLIMIT_STACK, &rlim)\fP の呼び出しで確立された 制限に達してしまった場合に、この様な事が起こる。
131 標準のスタックを使い果たしてしまうと、 カーネルはプロセスに \fBSIGSEGV\fP シグナルを送る。
132 このような状況では、代替シグナルスタック上でしかシグナルをキャッチできない。
133 .P
134 Linux がサポートする多くのハードウェアアーキテクチャでは、 スタックは下位アドレス方向に積まれる。 \fBsigaltstack\fP()
135 はスタックが積まれる方向を自動的に決定する。
136 .P
137 代替シグナルスタック上で実行されている シグナルハンドラから呼ばれる関数も、代替シグナルハンドラを使う
138 (プロセスが代替シグナルスタック上で実行されている場合、 他のシグナルで呼び出されるハンドラもこの代替シグナルハンドラを使う)。
139 標準のスタックとは異なり、 システムは代替シグナルスタックを自動的に拡張しない。 代替シグナルスタック用に確保したサイズを越えた場合、
140 結果は予想できない。
141 .P
142 \fBexecve\fP(2)  の呼び出しが成功すると、 既存の全ての代替シグナルスタックが削除される。 \fBfork\fP(2)
143 経由で作成された子プロセスは、親プロセスの代替シグナルスタックの 設定のコピーを継承する。
144 .P
145 \fBsigaltstack\fP()  は以前の \fBsigstack\fP()  を置き換えるものである。 過去プログラムとの互換性のため、glibc では
146 \fBsigstack\fP()  も提供している。 新しいのアプリケーションは全て \fBsigaltstack\fP()  を使って書くべきである。
147 .SS 歴史
148 4.2BSD には \fBsigstack\fP()  システムコールがあった。 この関数は少し異なった構造体を使っており、
149 呼び出した側がスタックの積まれる方向を知っていなければならないという 大きな欠点があった。
150 .SH 例
151 以下のコードで \fBsigaltstack\fP()  の使用法の一部を示す:
152
153 .in +4n
154 .nf
155 stack_t ss;
156
157 ss.ss_sp = malloc(SIGSTKSZ);
158 if (ss.ss_sp == NULL)
159     /* ハンドルエラー */;
160 ss.ss_size = SIGSTKSZ;
161 ss.ss_flags = 0;
162 if (sigaltstack(&ss, NULL) == \-1)
163     /* ハンドルエラー */;
164 .fi
165 .in
166 .SH 関連項目
167 \fBexecve\fP(2), \fBsetrlimit\fP(2), \fBsigaction\fP(2), \fBsiglongjmp\fP(3),
168 \fBsigsetjmp\fP(3), \fBsignal\fP(7)
169 .SH この文書について
170 この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.53 の一部
171 である。プロジェクトの説明とバグ報告に関する情報は
172 http://www.kernel.org/doc/man\-pages/ に書かれている。