OSDN Git Service

Update README
[linuxjm/LDP_man-pages.git] / draft / man2 / select.2
1 .\" This manpage is copyright (C) 1992 Drew Eckhardt,
2 .\"                 copyright (C) 1995 Michael Shields.
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 .\" Modified 1993-07-24 by Rik Faith <faith@cs.unc.edu>
27 .\" Modified 1995-05-18 by Jim Van Zandt <jrv@vanzandt.mv.com>
28 .\" Sun Feb 11 14:07:00 MET 1996  Martin Schulze  <joey@linux.de>
29 .\"     * layout slightly modified
30 .\"
31 .\" Modified Mon Oct 21 23:05:29 EDT 1996 by Eric S. Raymond <esr@thyrsus.com>
32 .\" Modified Thu Feb 24 01:41:09 CET 2000 by aeb
33 .\" Modified Thu Feb  9 22:32:09 CET 2001 by bert hubert <ahu@ds9a.nl>, aeb
34 .\" Modified Mon Nov 11 14:35:00 PST 2002 by Ben Woodard <ben@zork.net>
35 .\" 2005-03-11, mtk, modified pselect() text (it is now a system
36 .\"     call in 2.6.16.
37 .\"
38 .\"*******************************************************************
39 .\"
40 .\" This file was generated with po4a. Translate the source file.
41 .\"
42 .\"*******************************************************************
43 .\"
44 .\" Japanese Version Copyright (c) 1997 HANATAKA Shinya all rights reserved.
45 .\" Translated 1997-02-23, HANATAKA Shinya <hanataka@abyss.rim.or.jp>
46 .\" Modified 2000-03-12, HANATAKA Shinya <hanataka@abyss.rim.or.jp>
47 .\" Updated & Modified 2001-06-04, Yuichi SATO <ysato@h4.dion.ne.jp>
48 .\" Updated & Modified 2001-07-01, Yuichi SATO
49 .\" Updated & Modifedd 2002-01-14, Yuichi SATO
50 .\" Updated 2002-09-24, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
51 .\" Updated 2003-01-19, Akihiro MOTOKI
52 .\" Updated 2005-03-17, Akihiro MOTOKI
53 .\" Updated 2006-04-16, Akihiro MOTOKI, LDP v2.28
54 .\" Updated 2006-07-23, Akihiro MOTOKI, LDP v2.36
55 .\" Updated 2007-09-08, Akihiro MOTOKI, LDP v2.64
56 .\" Updated 2008-08-06, Akihiro MOTOKI, LDP v3.05
57 .\" Updated 2012-05-30, Akihiro MOTOKI <amotoki@gmail.com>
58 .\" Updated 2013-05-06, Akihiro MOTOKI <amotoki@gmail.com>
59 .\"
60 .TH SELECT 2 2015\-01\-22 Linux "Linux Programmer's Manual"
61 .SH 名前
62 select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO \- 同期 I/O の多重化
63 .SH 書式
64 .nf
65 /* POSIX.1\-2001 に従う場合 */
66 .br
67 \fB#include <sys/select.h>\fP
68 .sp
69 /* 以前の規格に従う場合 */
70 .br
71 \fB#include <sys/time.h>\fP
72 .br
73 \fB#include <sys/types.h>\fP
74 .br
75 \fB#include <unistd.h>\fP
76 .sp
77 \fBint select(int \fP\fInfds\fP\fB, fd_set *\fP\fIreadfds\fP\fB, fd_set *\fP\fIwritefds\fP\fB,\fP
78 \fB           fd_set *\fP\fIexceptfds\fP\fB, struct timeval *\fP\fItimeout\fP\fB);\fP
79 .sp
80 \fBvoid FD_CLR(int \fP\fIfd\fP\fB, fd_set *\fP\fIset\fP\fB);\fP
81 .br
82 \fBint  FD_ISSET(int \fP\fIfd\fP\fB, fd_set *\fP\fIset\fP\fB);\fP
83 .br
84 \fBvoid FD_SET(int \fP\fIfd\fP\fB, fd_set *\fP\fIset\fP\fB);\fP
85 .br
86 \fBvoid FD_ZERO(fd_set *\fP\fIset\fP\fB);\fP
87 .sp
88 \fB#include <sys/select.h>\fP
89 .sp
90 \fBint pselect(int \fP\fInfds\fP\fB, fd_set *\fP\fIreadfds\fP\fB, fd_set *\fP\fIwritefds\fP\fB,\fP
91 \fB            fd_set *\fP\fIexceptfds\fP\fB, const struct timespec *\fP\fItimeout\fP\fB,\fP
92 \fB            const sigset_t *\fP\fIsigmask\fP\fB);\fP
93 .fi
94 .sp
95 .in -4n
96 glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7)  参照):
97 .in
98 .sp
99 \fBpselect\fP(): _POSIX_C_SOURCE\ >=\ 200112L || _XOPEN_SOURCE\ >=\ 600
100 .SH 説明
101 \fBselect\fP()  や \fBpselect\fP()  を使うと、プログラムで複数のファイルディスクリプターを監視し、
102 一つ以上のファイルディスクリプターがある種の I/O 操作の 「ready (準備ができた)」状態 (例えば、読み込み可能になった状態)
103 になるまで待つことができる。 ファイルディスクリプターが ready (準備ができた) とは、 (\fBread\fP(2)  などの) 対応する I/O
104 操作が停止 (block) なしに実行したり、 十分小さな \fBwrite\fP(2) を実行したりできる状態にあることを意味する。
105 .PP
106 \fBselect\fP()  と \fBpselect\fP()  の動作は同じであるが、以下の 3 点が異なる:
107 .TP 
108 (i)
109 \fBselect\fP()  では、タイムアウト時間の指定に構造体 \fIstruct timeval\fP (秒・マイクロ秒単位) を用いる。 一方、
110 \fBpselect\fP()  関数では、構造体 \fIstruct timespec\fP (秒・ナノ秒単位) を用いる。
111 .TP 
112 (ii)
113 \fBselect\fP()  は残り時間を示す \fItimeout\fP 引き数を更新することがある。 \fBpselect\fP()  はこの引き数を変更しない。
114 .TP 
115 (iii)
116 \fBselect\fP()  は \fIsigmask\fP 引き数を持たない。その動作は \fIsigmask\fP に NULL を指定した場合の
117 \fBpselect\fP()  と同じである。
118 .PP
119 3 つの独立したファイルディスクリプター集合の監視を行う。 \fIreadfds\fP に入れられたディスクリプターについては、読み込みが可能かどうかを
120 監視する (より正確にいうと、停止 (block) なしで読むことができるかを 調べる。ファイルの終端 (end\-of\-file) の場合も、
121 ファイルディスクリプターは読み込み可能として扱われる)。 \fIwritefds\fP
122 に入れられたディスクリプターについては、書き込み用に利用可能な領域があるかを監視する (ただし、大きな書き込みの場合には停止する可能性はある)。
123 \fIexceptfds\fP にあるものについては、例外の監視を行なう。システムコール終了時に、
124 どのファイルディスクリプターの状態が実際に変化したか示すために、 集合の内容が変更される。
125 ある種別のイベントを監視したいファイルディスクリプターが一つもない場合には、 対応するファイルディスクリプター集合に NULL を指定することができる。
126 .PP
127 集合を操作するために 4 つのマクロが提供されている。 \fBFD_ZERO\fP()  は集合を消去する。 \fBFD_SET\fP()  と
128 \fBFD_CLR\fP()  はそれぞれ指定したファイルディスクリプターの集合への追加、削除を行う。 \fBFD_ISSET\fP()
129 は集合にファイルディスクリプターがあるかどうか調べる; このマクロは \fBselect\fP()  が終了した後に使うと便利である。
130 .PP
131 \fInfds\fP は 3 つの集合に含まれるファイルディスクリプターの最大値に 1 を足したものである。
132 .PP
133 \fItimeout\fP 引き数は、 \fBselect\fP() がファイルディスクリプターが ready になるのを待って停止する時間を指定する。
134 呼び出しは以下のいずれかになるまで停止する。
135 .IP * 3
136 ファイルディスクリプターが利用可能になる。
137 .IP *
138 システムコールがシグナルハンドラーにより割り込まれた。
139 .IP *
140 タイムアウト時間が満了した。
141 .PP
142 この \fItimeout\fP 時間はシステムクロックの粒度に切り上げられ、
143 カーネルのスケジューリング遅延により少しだけ長くなる可能性がある点に注意すること。 \fItimeval\fP 構造体の両方のフィールドが 0 の場合、
144 \fBselect\fP() はすぐに復帰する (この機能はポーリング (polling) を行うのに便利である)。 \fItimeout\fP に NULL
145 (タイムアウトなし) が指定されると、 \fBselect\fP() は無期限に停止 (block) する。
146 .PP
147 \fIsigmask\fP は、シグナルマスク (\fBsigprocmask\fP(2)  を参照) へのポインターである。 \fIsigmask\fP が NULL
148 でない場合、 \fBpselect\fP()  は \fIsigmask\fP が指しているシグナルマスクで現在のシグナルマスクを置き換えてから、 "select"
149 関数を実行し、 終了後にシグナルマスクを元のシグナルマスクに戻す。
150 .PP
151 \fItimeout\fP 引き数の精度の違いを除くと、以下の \fBpselect\fP()  の呼び出しは、
152 .nf
153
154     ready = pselect(nfds, &readfds, &writefds, &exceptfds,
155                     timeout, &sigmask);
156
157 .fi
158 次のコールを \fIatomic\fP に実行するのと等価である。
159 .nf
160
161     sigset_t origmask;
162
163     pthread_sigmask(SIG_SETMASK, &sigmask, &origmask);
164     ready = select(nfds, &readfds, &writefds, &exceptfds, timeout);
165     pthread_sigmask(SIG_SETMASK, &origmask, NULL);
166 .fi
167 .PP
168 \fBpselect\fP()  が必要になる理由は、シグナルやファイルディスクリプターの状態変化を 待ちたいときには、競合状態を避けるために atomic
169 なテストが必要になる からである。 (シグナルハンドラーが大域フラグを設定して戻る場合を考えてみよう。 この大域フラグのテストに続けて
170 \fBselect\fP()  を呼び出すと、 シグナルがテストの直後かつ呼び出しの直前に届いた時には \fBselect\fP()
171 は永久にハングしてしまうかもしれない。 一方、 \fBpselect\fP()  を使うと、まずシグナルを禁止 (block)
172 して、入ってくるシグナルを操作し、 望みの \fIsigmask\fP で \fBpselect\fP()  を呼び出すことで、前記の競合を避けることができる。)
173 .SS タイムアウト
174 これらの関数で使用される時間関連の構造体は、 \fI<sys/time.h>\fP で
175
176 .in +4n
177 .nf
178 struct timeval {
179     long    tv_sec;         /* 秒 */
180     long    tv_usec;        /* マイクロ秒 */
181 };
182 .fi
183 .in
184
185
186
187 .in +4n
188 .nf
189 struct timespec {
190     long    tv_sec;         /* 秒 */
191     long    tv_nsec;        /* ナノ秒 */
192 };
193 .fi
194 .in
195
196 のように定義されている。 (POSIX.1\-2001 での定義については下記の「注意」を参照)
197 .PP
198 秒単位以下の精度でスリープを実現する 移植性の高い方法として、 3 つの集合全てを空、 \fInfds\fP を 0 、 \fItimeout\fP を NULL
199 でない値に設定して \fBselect\fP()  を呼び出すという方法を使っているコードもある。
200 .PP
201 .\" .PP - it is rumored that:
202 .\" On BSD, when a timeout occurs, the file descriptor bits are not changed.
203 .\" - it is certainly true that:
204 .\" Linux follows SUSv2 and sets the bit masks to zero upon a timeout.
205 Linux では、 \fBselect\fP()  は \fItimeout\fP を変更し、残りの停止時間を反映するようになっているが、
206 他のほとんどの実装ではこのようになっていない (POSIX.1\-2001 はどちらの動作も認めている)。 このため、 \fItimeout\fP
207 を参照している Linux のコードを他のオペレーティングシステムへ 移植する場合、問題が起こる。 また、ループの中で \fItimeval\fP
208 構造体を初期化せずにそのまま再利用して \fBselect\fP()  を複数回行なっているコードを Linux へ移植する場合にも、問題が起こる。
209 \fBselect\fP()  から復帰した後は \fItimeout\fP は未定義であると考えるべきである。
210 .SH 返り値
211 成功した場合、 \fBselect\fP()  と \fBpselect\fP()  は更新された 3 つのディスクリプター集合に含まれている
212 ファイルディスクリプターの数 (つまり、 \fIreadfds\fP, \fIwritefds\fP, \fIexceptfds\fP 中の 1
213 になっているビットの総数) を返す。 何も起こらずに時間切れになった場合、 ディスクリプターの数は 0 になることもある。 エラーならば \-1 を返し、
214 \fIerrno\fP にエラーを示す値が設定される; ファイルディスクリプター集合は変更されず、 \fItimeout\fP は不定となる。
215 .SH エラー
216 .TP 
217 \fBEBADF\fP
218 いずれかの集合に無効なファイルディスクリプターが指定された (おそらくは、すでにクローズされたファイルディスクリプターか、
219 エラーが発生したファイルディスクリプターが指定された)。
220 .TP 
221 \fBEINTR\fP
222 シグナルを受信した。
223 .TP 
224 \fBEINVAL\fP
225 \fInfds\fP が負、 またはリソース上限 \fBRLIMIT_NOFILE\fP (\fBgetrlimit\fP(2) 参照) より大きい。
226 .TP 
227 \fBEINVAL\fP
228 \fItimeout\fP に入っている値が不正である。
229 .TP 
230 \fBENOMEM\fP
231 内部テーブルにメモリーを割り当てることができなかった。
232 .SH バージョン
233 \fBpselect\fP()  はカーネル 2.6.16 で Linux に追加された。 それ以前は、 \fBpselect\fP()  は glibc
234 でエミュレートされていた (「バグ」の章を参照)。
235 .SH 準拠
236 \fBselect\fP()  は POSIX.1\-2001 と 4.4BSD (\fBselect\fP()  は 4.2BSD で最初に登場した) に準拠する。
237 BSD ソケット層のクローンをサポートしている非 BSD システム (System\ V 系も含む) との間でだいたい移植性がある。しかし
238 System\ V 系では たいがい timeout 変数を exit の前にセットするが、 BSD 系ではそうでないので注意すること。
239 .PP
240 \fBpselect\fP()  は POSIX.1g と POSIX.1\-2001 で定義されている。
241 .SH 注意
242 \fIfd_set\fP は固定サイズのバッファーである。 負や \fBFD_SETSIZE\fP 以上の値を持つ \fIfd\fP に対して \fBFD_CLR\fP()
243 や \fBFD_SET\fP()  を実行した場合、 どのような動作をするかは定義されていない。 また、 POSIX では \fIfd\fP
244 は有効なファイルディスクリプターでなければならないと規定されている。
245
246 型宣言に関しては、昔ながらの状況では \fItimeval\fP 構造体の 2 つのフィールドは (上記のように) 両方とも \fIlong\fP
247 型であり、構造体は \fI<sys/time.h>\fP で定義されている。 POSIX.1\-2001 の下では、以下のようになっている。
248
249 .in +4n
250 .nf
251 struct timeval {
252          time_t         tv_sec;     /* 秒 */
253          suseconds_t    tv_usec;    /* マイクロ秒 */
254 };
255 .fi
256 .in
257
258 この構造体は \fI<sys/select.h>\fP で定義されており、データ型 \fItime_t\fP と \fIsuseconds_t\fP は
259 \fI<sys/types.h>\fP で定義されている。
260 .LP
261 プロトタイプに関しては、昔ながらの状況で \fBselect\fP()  を使いたい場合は、 \fI<time.h>\fP
262 をインクルードすればよい。 POSIX.1\-2001 の環境で \fBselect\fP()  と \fBpselect\fP()  を使いたい場合は、
263 \fI<sys/select.h>\fP をインクルードすればよい。
264
265 glibc 2.0 では \fI<sys/select.h>\fP が提供する \fBpselect\fP()  のプロトタイプが間違っている。
266 glibc 2.1 から 2.2.1 では \fB_GNU_SOURCE\fP が定義されている場合に、 \fBpselect\fP()  が提供される。
267 glibc 2.2.2 以降では、 \fBpselect\fP()  を使用するには、「書式」に記載された要件を満たす必要がある。
268 .SS マルチスレッドアプリケーション
269 .\"
270 \fBselect\fP() で監視中のファイルディスクリプターが別のスレッドでクローズされた場合、どのような結果になるかは規定されていない。いくつかの
271 UNIX システムでは、 \fBselect\fP() は停止 (block) せず、すぐ返り、ファイルディスクリプターが ready だと報告される
272 (\fBselect\fP() が返ってから I/O 操作が実行されるまでの間に、 別のファイルディスクリプターが再度オープンされない限り、 それ以降の
273 I/O 操作はおそらく失敗するだろう)。 Linux (や他のいくつかのシステム) では、 別のスレッドでファイルディスクリプターがクローズされても
274 \fBselect\fP() には影響を与えない。
275 まとめると、このような場合に特定の動作に依存しているアプリケーションは「バグっている」と考えなければならない。
276 .SS "C ライブラリとカーネル ABI の違い"
277 このページで説明している \fBpselect\fP() のインターフェースは、glibc に
278 実装されているものである。内部で呼び出される Linux のシステムコールは
279 \fBpselect6\fP() という名前である。このシステムコールは glibc のラッパー
280 関数とは少し違った動作をする。
281
282 Linux の \fBpselect6\fP() システムコールは \fItimeout\fP 引き数を変更する。
283 しかし、glibc のラッパー関数は、システムコールに渡す timeout 引き数と
284 してローカル変数を使うことでこの動作を隠蔽している。このため、glibc の
285 \fBpselect\fP() 関数は \fItimeout\fP 引き数を変更しない。
286 これが POSIX.1\-2001 が要求している動作である。
287
288 \fBpselect6\fP() システムコールの最後の引き数は \fIsigset_t\ *\fP 型の
289 ポインターではなく、以下に示す構造体である。
290 .in +4
291 .nf
292
293 struct {
294     const sigset_t *ss;     /* シグナル集合へのポインター */
295     size_t          ss_len; /* 'ss' が指すオブジェクトのサイズ
296                                (バイト数) */
297 };
298
299 .fi
300 .in
301 このようにすることで、ほとんどのアーキテクチャーがサポートしている
302 システムコールの引き数が最大で 6 個という事実を満たしつつ、
303 \fBpselect6\fP() システムコールがシグナル集合へのポインターとシグナル集合
304 のサイズの両方を取得することができるのである。
305 .SH バグ
306 glibc 2.0 では、 \fIsigmask\fP 引き数を取らないバージョンの \fBpselect\fP()  が提供されていた。
307
308 バージョン 2.1 以降の glibc では、 \fBpselect\fP()  は \fBsigprocmask\fP(2)  と \fBselect\fP()
309 を使ってエミュレートされていた。 この実装にはきわどい競合条件において脆弱性が残っていた。 この競合条件における問題を防止するために
310 \fBpselect\fP()  は設計されたのである。 最近のバージョンの glibc では、カーネルがサポートしている場合には、 (競合が起こらない)
311 \fBpselect\fP()  システムコールが使用される。
312
313 \fBpselect\fP() がないシステムにおいて、シグナルの捕捉を信頼性があり (移植
314 性も高い) 方法で行うには、 自己パイプ (self\-pipe) という技を使うとよい。
315 この方法では、シグナルハンドラーはパイプへ 1 バイトのデータを書き込み、
316 同じパイプのもう一端をメインプログラムの \fBselect\fP() で監視する (一杯に
317 なったパイプへの書き込みや空のパイプから読み出しを行った際に起こるであ
318 ろう停止 (blocking) を避けるためには、パイプへの読み書きの際には 非停止
319 (nonblocking) I/O を使用するとよい)。
320
321 .\" Stevens discusses a case where accept can block after select
322 .\" returns successfully because of an intervening RST from the client.
323 .\" Maybe the kernel should have returned EIO in such a situation?
324 Linux では、 \fBselect\fP()  がソケットファイルディスクリプターで "読み込みの準備ができた" と報告した場合でも、 この後で read
325 を行うと停止 (block) することがある。このような状況は、 例えば、データが到着したが、検査でチェックサム異常が見つかり廃棄された時
326 などに起こりえる。他にもファイルディスクリプターが準備できたと間違って 報告される状況が起こるかもしれない。
327 したがって、停止すべきではないソケットに対しては \fBO_NONBLOCK\fP を使うとより安全であろう。
328
329 Linux では、 \fBselect\fP()  がシグナルハンドラーにより割り込まれた場合 (つまり \fBEINTR\fP エラーが返る場合)、
330 \fItimeout\fP も変更する。 これは POSIX.1\-2001 では認められていない挙動である。 Linux の \fBpselect\fP()
331 システムコールも同じ挙動をするが、 glibc のラッパー関数がこの挙動を隠蔽している。 具体的には、glibc のラッパー関数の内部で、
332 \fItimeout\fP をローカル変数にコピーし、 このローカル変数をシステムコールに渡している。
333 .SH 例
334 .nf
335 #include <stdio.h>
336 #include <stdlib.h>
337 #include <sys/time.h>
338 #include <sys/types.h>
339 #include <unistd.h>
340
341 int
342 main(void)
343 {
344     fd_set rfds;
345     struct timeval tv;
346     int retval;
347
348     /* stdin (fd 0) を監視し、入力があった場合に表示する。*/
349     FD_ZERO(&rfds);
350     FD_SET(0, &rfds);
351
352     /* 5 秒間監視する。*/
353     tv.tv_sec = 5;
354     tv.tv_usec = 0;
355
356     retval = select(1, &rfds, NULL, NULL, &tv);
357     /* この時点での tv の値を信頼してはならない。*/
358
359     if (retval == \-1)
360         perror("select()");
361     else if (retval)
362         printf("今、データが取得できました。\en");
363         /* FD_ISSET(0, &rfds) が true になる。*/
364     else
365         printf("5 秒以内にデータが入力されませんでした。\en");
366
367     exit(EXIT_SUCCESS);
368 }
369 .fi
370 .SH 関連項目
371 \fBaccept\fP(2), \fBconnect\fP(2), \fBpoll\fP(2), \fBread\fP(2), \fBrecv\fP(2),
372 \fBrestart_syscall\fP(2), \fBsend\fP(2), \fBsigprocmask\fP(2), \fBwrite\fP(2),
373 \fBepoll\fP(7), \fBtime\fP(7)
374
375 考察と使用例の書かれたチュートリアルとして、 \fBselect_tut\fP(2)  がある。
376 .SH この文書について
377 この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部
378 である。プロジェクトの説明とバグ報告に関する情報は
379 http://www.kernel.org/doc/man\-pages/ に書かれている。