OSDN Git Service

長音記号の修正を release に反映
[linuxjm/LDP_man-pages.git] / release / man2 / signalfd.2
1 .\" Copyright (C) 2008 Michael Kerrisk <mtk.manpages@gmail.com>
2 .\" starting from a version by Davide Libenzi <davidel@xmailserver.org>
3 .\"
4 .\" %%%LICENSE_START(GPLv2+_SW_3_PARA)
5 .\" This program is free software; you can redistribute it and/or modify
6 .\" it under the terms of the GNU General Public License as published by
7 .\" the Free Software Foundation; either version 2 of the License, or
8 .\" (at your option) any later version.
9 .\"
10 .\" This program is distributed in the hope that it will be useful,
11 .\" but WITHOUT ANY WARRANTY; without even the implied warranty of
12 .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 .\" GNU General Public License for more details.
14 .\"
15 .\" You should have received a copy of the GNU General Public
16 .\" License along with this manual; if not, see
17 .\" <http://www.gnu.org/licenses/>.
18 .\" %%%LICENSE_END
19 .\"
20 .\"*******************************************************************
21 .\"
22 .\" This file was generated with po4a. Translate the source file.
23 .\"
24 .\"*******************************************************************
25 .\"
26 .\" Japanese Version Copyright (c) 2008  Akihiro MOTOKI
27 .\"         all rights reserved.
28 .\" Translated 2008-04-06, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v2.79
29 .\" Updated 2008-11-10, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v3.13
30 .\" Updated 2009-02-23, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v3.18
31 .\"
32 .TH SIGNALFD 2 2014\-07\-08 Linux "Linux Programmer's Manual"
33 .SH 名前
34 signalfd \- シグナル受け付け用のファイルディスクリプターを生成する
35 .SH 書式
36 \fB#include <sys/signalfd.h>\fP
37 .sp
38 \fBint signalfd(int \fP\fIfd\fP\fB, const sigset_t *\fP\fImask\fP\fB, int \fP\fIflags\fP\fB);\fP
39 .SH 説明
40 \fBsignalfd\fP()  は、呼び出し元宛てのシグナルを受け付けるために使用されるファイル ディスクリプターを生成する。
41 この方法はシグナルハンドラーや \fBsigwaitinfo\fP(2)  を用いる方法の代わりとなるものであり、このファイルディスクリプターを
42 \fBselect\fP(2), \fBpoll\fP(2), \fBepoll\fP(7)  で監視できるという利点がある。
43
44 \fImask\fP 引き数には、呼び出し元がこのファイルディスクリプター経由で受け付けたい
45 シグナル集合を指定する。この引き数で指定するシグナル集合の内容は、 \fBsigsetops\fP(3)
46 で説明されているマクロを使って初期化することができる。 通常、ファイルディスクリプター経由で受信するシグナル集合は、
47 そのシグナルがデフォルトの配送方法に基いて処理されるのを防ぐために、 \fBsigprocmask\fP(2)  を使ってブロックしておくべきである。
48 シグナル \fBSIGKILL\fP と \fBSIGSTOP\fP を signalfd ファイルディスクリプター経由で受信することはできない。
49 これらのシグナルが \fImask\fP で指定された場合には黙って無視される。
50
51 \fIfd\fP 引き数が \-1 の場合、 \fBsignalfd\fP()  は新しいファイルディスクリプターを生成し、 \fImask\fP
52 で指定されたシグナル集合をそのファイルディスクリプターに関連付ける。 \fIfd\fP 引き数が \-1 以外の場合、 \fIfd\fP には有効な既存の
53 signalfd ファイルディスクリプターを指定しなければならず、 そのディスクリプターに関連付けられているシグナル集合は \fImask\fP
54 を使って置き換えられる。
55
56 Linux 2.6.27 以降では、 以下の値のいくつかをビット単位の論理和 (OR) で指定することで、 \fBsignalfd\fP()
57 の振舞いを変更することができる。
58 .TP  14
59 \fBSFD_NONBLOCK\fP
60 新しく生成されるオープンファイル記述 (open file description) の \fBO_NONBLOCK\fP
61 ファイルステータスフラグをセットする。 このフラグを使うことで、 \fBO_NONBLOCK\fP をセットするために \fBfcntl\fP(2)
62 を追加で呼び出す必要がなくなる。
63 .TP 
64 \fBSFD_CLOEXEC\fP
65 新しいファイルディスクリプターに対して close\-on\-exec (\fBFD_CLOEXEC\fP)  フラグをセットする。
66 このフラグが役に立つ理由については、 \fBopen\fP(2)  の \fBO_CLOEXEC\fP フラグの説明を参照のこと。
67 .PP
68 バージョン 2.6.26 以前の Linux では、 \fIflags\fP 引き数は未使用であり、0 を指定しなければならない。
69
70 \fBsignalfd\fP()  が返すファイルディスクリプターは以下の操作をサポートしている。
71 .TP 
72 \fBread\fP(2)
73 \fImask\fP に指定されているシグナルのうち一つ以上がそのプロセスに対して 処理待ち (pending) であれば、それらのシグナルの情報が
74 \fBread\fP(2)  に渡されたバッファーを使って、 \fIsignalfd_siginfo\fP 構造体に格納されて返される。 \fBread\fP(2)
75 は、バッファーに格納可能な範囲でできるだけ多くの処理待ちのシグナルに ついての情報を返す。 バッファーは最低でも \fIsizeof(struct
76 signalfd_siginfo)\fP バイトの大きさがなければならない。 \fBread\fP(2)  の返り値は読み出されたトータルのバイト数である。
77 .IP
78 \fBread\fP(2)  が行われた結果、シグナルは消費され、 これらのシグナルはそのプロセスに対しては処理待ちではなくなる
79 (つまり、シグナルハンドラーで捕捉されることもなく、 \fBsigwaitinfo\fP(2)  を使って受け取ることもできなくなる)。
80 .IP
81 \fImask\fP に指定されているシグナルがそのプロセスに対して一つも処理待ちでなければ、 \fBread\fP(2)  は、 \fImask\fP
82 で指定されたシグナルのうちいずれか一つがそのプロセスに対して発生するまで 停止 (block) する、もしくはファイルディスクリプターが非停止
83 (nonblocking)  に設定されている場合はエラー \fBEAGAIN\fP で失敗する。
84 .TP 
85 \fBpoll\fP(2), \fBselect\fP(2) (と同様の操作)
86 \fImask\fP に指定されたシグナルのうち一つ以上がそのプロセスに対して処理待ちであれば、 ファイルディスクリプターは読み出し可能となる
87 (\fBselect\fP(2)  の \fIreadfds\fP 引き数や \fBpoll\fP(2)  の \fBPOLLIN\fP フラグ)。
88 .IP
89 signalfd ファイルディスクリプターは、これ以外のファイルディスクリプター 多重 API である \fBpselect\fP(2),
90 \fBppoll\fP(2), \fBepoll\fP(7)  もサポートしている。
91 .TP 
92 \fBclose\fP(2)
93 ファイルディスクリプターがそれ以降は必要なくなった際には、クローズすべきである。 同じ signalfd
94 オブジェクトに関連付けられたファイルディスクリプターが全て クローズされると、そのオブジェクト用の資源がカーネルにより解放される。
95 .SS "signalfd_siginfo 構造体"
96 signalfd ファイルディスクリプターからの \fBread\fP(2)  で返される \fIsignalfd_siginfo\fP
97 構造体のフォーマットは以下の通りである。
98 .in +4n
99 .nf
100
101 .\" ssi_trapno is unused on most arches
102 .\" FIXME Since Linux 2.6.37 there is 'uint16_t ssi_addr_lsb'
103 .\" in the signalfd_siginfo structure. This needs to be documented.
104 struct signalfd_siginfo {
105 struct signalfd_siginfo {
106     uint32_t ssi_signo;   /* シグナル番号 */
107     int32_t  ssi_errno;   /* エラー番号 (未使用) */
108     int32_t  ssi_code;    /* シグナルコード */
109     uint32_t ssi_pid;     /* 送信元の PID */
110     uint32_t ssi_uid;     /* 送信元の実 UID */
111     int32_t  ssi_fd;      /* ファイルディスクリプター (SIGIO) */
112     uint32_t ssi_tid;     /* カーネルタイマー ID (POSIX タイマー)
113     uint32_t ssi_band;    /* Band イベント (SIGIO) */
114     uint32_t ssi_overrun; /* POSIX タイマーのオーバーラン回数 */
115     uint32_t ssi_trapno;  /* シグナルの原因となったトラップ番号 */
116     int32_t  ssi_status;  /* 終了ステータスかシグナル (SIGCHLD) */
117     int32_t  ssi_int;     /* sigqueue(3) から送られた整数 */
118     uint64_t ssi_ptr;     /* sigqueue(3) から送られたポインター */
119     uint64_t ssi_utime;   /* 消費したユーザー CPU 時間 (SIGCHLD) */
120     uint64_t ssi_stime;   /* 消費したシステム CPU 時間 (SIGCHLD) */
121     uint64_t ssi_addr;    /* シグナルを生成したアドレス
122                              (ハードウェアが生成したシグナルの場合) */
123     uint8_t  pad[\fIX\fP];      /* pad の大きさは 128 バイト
124                              (将来のフィールド追加用の場所の確保) */
125 };
126
127 .fi
128 .in
129 \fIsignalfd_siginfo\fP 構造体の各フィールドは、 \fIsiginfo_t\fP 構造体の同じような名前のフィールドと同様である。
130 \fIsiginfo_t\fP 構造体については \fBsigaction\fP(2)  に説明がある。 返された \fIsignalfd_siginfo\fP
131 構造体の全てのフィールドがあるシグナルに対して有効なわけではない。 どのフィールドが有効かは、 \fIssi_code\fP
132 フィールドで返される値から判定することができる。 このフィールドは \fIsiginfo_t\fP の \fIsi_code\fP フィールドと同様である。詳細は
133 \fBsigaction\fP(2)  を参照。
134 .SS "fork(2) での扱い"
135 \fBfork\fP(2)  が行われると、子プロセスは signalfd ファイルディスクリプターのコピーを 継承する。
136 子プロセスでこのファイルディスクリプターから \fBread\fP(2)  を行うと、子プロセスに対するキューに入っているシグナルに関する 情報が返される。
137 .SS "execve(2) での扱い"
138 他のファイルディスクリプターと全く同様に、 signalfd ファイルディスクリプターも \fBexecve\fP(2)
139 の前後でオープンされたままとなる。但し、そのファイルディスクリプターに close\-on\-exec のマーク (\fBfcntl\fP(2)  参照)
140 が付いている場合はクローズされる。 \fBexecve\fP(2)  の前に読み出し可能となっていた全てのシグナルは新しく起動されたプログラム
141 でも引き続き読み出し可能である (これは伝統的なシグナルの扱いと同じであり、 処理待ちのブロックされたシグナルは \fBexecve\fP(2)
142 の前後で処理待ちのままとなる)。
143 .SS スレッドでの扱い
144 マルチスレッドプログラムにおける signalfd ファイルディスクリプターの扱いは シグナルの標準的な扱いと全く同じである。
145 言い換えると、あるスレッドが signalfd ファイルディスクリプターから 読み出しを行うと、そのスレッド自身宛てのシグナルとプロセス (すなわち
146 スレッドグループ全体) 宛てのシグナルが読み出される。 (スレッドは同じプロセスの他のスレッド宛てのシグナルを読み出すことはできない。)
147 .SH 返り値
148 成功すると、 \fBsignalfd\fP()  は signalfd ファイルディスクリプターを返す。 返されるファイルディスクリプターは、 \fIfd\fP が
149 \-1 の場合は新規のファイルディスクリプターであり、 \fIfd\fP が有効な signalfd ファイルディスクリプターだった場合は \fIfd\fP
150 自身である。 エラーの場合、\-1 を返し、 \fIerrno\fP にエラーを示す値を設定する。
151 .SH エラー
152 .TP 
153 \fBEBADF\fP
154 ファイルディスクリプター \fIfd\fP が有効なファイルディスクリプターでない。
155 .TP 
156 \fBEINVAL\fP
157 .\" or, the
158 .\" .I sizemask
159 .\" argument is not equal to
160 .\" .IR sizeof(sigset_t) ;
161 \fIfd\fP が有効な signalfd ファイルディスクリプターではない。
162 .TP 
163 \fBEINVAL\fP
164 \fIflags\fP が無効である。もしくは、Linux 2.6.26 以前の場合には \fIflags\fP が 0 以外である。
165 .TP 
166 \fBEMFILE\fP
167 オープン済みのファイルディスクリプターの数がプロセスあたりの上限に 達していた。
168 .TP 
169 \fBENFILE\fP
170 オープン済みのファイル総数がシステム全体の上限に達していた。
171 .TP 
172 \fBENODEV\fP
173 (カーネル内の) 無名 inode デバイスをマウントできなかった。
174 .TP 
175 \fBENOMEM\fP
176 新しい signalfd ファイルディスクリプターを生成するのに十分なメモリーがなかった。
177 .SH バージョン
178 .\" signalfd() is in glibc 2.7, but reportedly does not build
179 \fBsignalfd\fP()  はカーネル 2.6.22 以降の Linux で利用可能である。 正しく動作する glibc 側のサポートはバージョン
180 2.8 以降で提供されている。 \fBsignalfd4\fP()  システムコール (「注意」参照) は カーネル 2.6.27 以降の Linux
181 で利用可能である。
182 .SH 準拠
183 \fBsignalfd\fP()  と \fBsignalfd4\fP()  は Linux 固有である。
184 .SH 注意
185 一つのプロセスは複数の signalfd ファイルディスクリプターを生成することができる。
186 これにより、異なるファイルディスクリプターで異なるシグナルを受け取ることが できる (この機能は \fBselect\fP(2), \fBpoll\fP(2),
187 \fBepoll\fP(7)  を使ってファイルディスクリプターを監視する場合に有用かもしれない。
188 異なるシグナルが到着すると、異なるファイルディスクリプターが利用可能に なるからだ)。 一つのシグナルが二つ以上のファイルディスクリプターの
189 \fImask\fP に含まれている場合、そのシグナルの発生はそのシグナルを \fImask\fP
190 に含むファイルディスクリプターのうちいずれか一つから読み出すことができる。
191 .SS "C ライブラリとカーネル ABI の違い"
192 実際の Linux のシステムコールでは \fIsize_t sizemask\fP という引き数が追加で必要である。この引き数で \fImask\fP
193 のサイズを指定する。 glibc の \fBsignalfd\fP()  ラッパー関数にはこの引き数は含まれず、
194 ラッパー関数が必要な値を計算して内部で呼び出すシステムコールに提供する。
195
196 下層にある Linux システムコールは二種類あり、 \fBsignalfd\fP()  と、もっと新しい \fBsignalfd4\fP()  である。
197 \fBsignalfd\fP()  は \fIflags\fP 引き数を実装していない。 \fBsignalfd4\fP()  では上記の値の \fIflags\fP
198 が実装されている。 glibc 2.9 以降では、 \fBsignalfd\fP()  のラッパー関数は、 \fBsignalfd4\fP()
199 が利用可能であれば、これを使用する。
200 .SH バグ
201 .\" The fix also was put into 2.6.24.5
202 カーネル 2.6.25 より前では、 \fBsigqueue\fP(3)  により送信されたシグナルと一緒に渡されるデータでは、フィールド
203 \fIssi_ptr\fP と \fIssi_int\fP は設定されない。
204 .SH 例
205 下記のプログラムは、シグナル \fBSIGINT\fP と \fBSIGQUIT\fP を signalfd ファイルディスクリプター経由で受信する。 シグナル
206 \fBSIGQUIT\fP 受信後にプログラムは終了する。 以下に示すシェルセッションにこのプログラムの使い方を示す。
207 .in +4n
208 .nf
209
210 $\fB ./signalfd_demo\fP
211 \fB^C\fP                   # Control\-C generates SIGINT
212 Got SIGINT
213 \fB^C\fP
214 Got SIGINT
215 \fB^\e\fP                    # Control\-\e generates SIGQUIT
216 Got SIGQUIT
217 $
218 .fi
219 .in
220 .SS プログラムのソース
221 \&
222 .nf
223 #include <sys/signalfd.h>
224 #include <signal.h>
225 #include <unistd.h>
226 #include <stdlib.h>
227 #include <stdio.h>
228
229 #define handle_error(msg) \e
230     do { perror(msg); exit(EXIT_FAILURE); } while (0)
231
232 int
233 main(int argc, char *argv[])
234 {
235     sigset_t mask;
236     int sfd;
237     struct signalfd_siginfo fdsi;
238     ssize_t s;
239
240     sigemptyset(&mask);
241     sigaddset(&mask, SIGINT);
242     sigaddset(&mask, SIGQUIT);
243
244     /* Block signals so that they aren\(aqt handled
245        according to their default dispositions */
246
247     if (sigprocmask(SIG_BLOCK, &mask, NULL) == \-1)
248         handle_error("sigprocmask");
249
250     sfd = signalfd(\-1, &mask, 0);
251     if (sfd == \-1)
252         handle_error("signalfd");
253
254     for (;;) {
255         s = read(sfd, &fdsi, sizeof(struct signalfd_siginfo));
256         if (s != sizeof(struct signalfd_siginfo))
257             handle_error("read");
258
259         if (fdsi.ssi_signo == SIGINT) {
260             printf("Got SIGINT\en");
261         } else if (fdsi.ssi_signo == SIGQUIT) {
262             printf("Got SIGQUIT\en");
263             exit(EXIT_SUCCESS);
264         } else {
265             printf("Read unexpected signal\en");
266         }
267     }
268 }
269 .fi
270 .SH 関連項目
271 \fBeventfd\fP(2), \fBpoll\fP(2), \fBread\fP(2), \fBselect\fP(2), \fBsigaction\fP(2),
272 \fBsigprocmask\fP(2), \fBsigwaitinfo\fP(2), \fBtimerfd_create\fP(2), \fBsigsetops\fP(3),
273 \fBsigwait\fP(3), \fBepoll\fP(7), \fBsignal\fP(7)
274 .SH この文書について
275 この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.78 の一部である。
276 プロジェクトの説明とバグ報告に関する情報は \%http://www.kernel.org/doc/man\-pages/ に書かれている。