OSDN Git Service

(split) LDP: Release pages for LDP v3.39.
[linuxjm/LDP_man-pages.git] / release / man2 / select.2
1 .\" Hey Emacs! This file is -*- nroff -*- source.
2 .\"
3 .\" This manpage is copyright (C) 1992 Drew Eckhardt,
4 .\"                 copyright (C) 1995 Michael Shields.
5 .\"
6 .\" Permission is granted to make and distribute verbatim copies of this
7 .\" manual provided the copyright notice and this permission notice are
8 .\" preserved on all copies.
9 .\"
10 .\" Permission is granted to copy and distribute modified versions of this
11 .\" manual under the conditions for verbatim copying, provided that the
12 .\" entire resulting derived work is distributed under the terms of a
13 .\" permission notice identical to this one.
14 .\"
15 .\" Since the Linux kernel and libraries are constantly changing, this
16 .\" manual page may be incorrect or out-of-date.  The author(s) assume no
17 .\" responsibility for errors or omissions, or for damages resulting from
18 .\" the use of the information contained herein.  The author(s) may not
19 .\" have taken the same level of care in the production of this manual,
20 .\" which is licensed free of charge, as they might when working
21 .\" professionally.
22 .\"
23 .\" Formatted or processed versions of this manual, if unaccompanied by
24 .\" the source, must acknowledge the copyright and authors of this work.
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 .TH SELECT 2 2010\-08\-31 Linux "Linux Programmer's Manual"
44 .SH 名前
45 select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO \- 同期 I/O の多重化
46 .SH 書式
47 .nf
48 /* POSIX.1\-2001 に従う場合 */
49 .br
50 \fB#include <sys/select.h>\fP
51 .sp
52 /* 以前の規格に従う場合 */
53 .br
54 \fB#include <sys/time.h>\fP
55 .br
56 \fB#include <sys/types.h>\fP
57 .br
58 \fB#include <unistd.h>\fP
59 .sp
60 \fBint select(int \fP\fInfds\fP\fB, fd_set *\fP\fIreadfds\fP\fB, fd_set *\fP\fIwritefds\fP\fB,\fP
61 \fB           fd_set *\fP\fIexceptfds\fP\fB, struct timeval *\fP\fItimeout\fP\fB);\fP
62 .sp
63 \fBvoid FD_CLR(int \fP\fIfd\fP\fB, fd_set *\fP\fIset\fP\fB);\fP
64 .br
65 \fBint  FD_ISSET(int \fP\fIfd\fP\fB, fd_set *\fP\fIset\fP\fB);\fP
66 .br
67 \fBvoid FD_SET(int \fP\fIfd\fP\fB, fd_set *\fP\fIset\fP\fB);\fP
68 .br
69 \fBvoid FD_ZERO(fd_set *\fP\fIset\fP\fB);\fP
70 .sp
71 \fB#include <sys/select.h>\fP
72 .sp
73 \fBint pselect(int \fP\fInfds\fP\fB, fd_set *\fP\fIreadfds\fP\fB, fd_set *\fP\fIwritefds\fP\fB,\fP
74 \fB            fd_set *\fP\fIexceptfds\fP\fB, const struct timespec *\fP\fItimeout\fP\fB,\fP
75 \fB            const sigset_t *\fP\fIsigmask\fP\fB);\fP
76 .fi
77 .sp
78 .in -4n
79 glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7)  参照):
80 .in
81 .sp
82 \fBpselect\fP(): _POSIX_C_SOURCE\ >=\ 200112L || _XOPEN_SOURCE\ >=\ 600
83 .SH 説明
84 \fBselect\fP()  や \fBpselect\fP()  を使うと、プログラムで複数のファイルディスクリプタを監視し、
85 一つ以上のファイルディスクリプタがある種の I/O 操作の 「ready (準備ができた)」状態 (例えば、読み込み可能になった状態)
86 になるまで待つことができる。 ファイルディスクリプタが ready (準備ができた) とは、 対応する I/O 操作 (例えば \fBread\fP(2)
87 など) が停止 (block) なしに実行可能な状態にあることを意味する。
88 .PP
89 \fBselect\fP()  と \fBpselect\fP()  の動作は同じであるが、以下の 3 点が異なる:
90 .TP 
91 (i)
92 \fBselect\fP()  では、タイムアウト時間の指定に構造体 \fIstruct timeval\fP (秒・マイクロ秒単位) を用いる。 一方、
93 \fBpselect\fP()  関数では、構造体 \fIstruct timespec\fP (秒・ナノ秒単位) を用いる。
94 .TP 
95 (ii)
96 \fBselect\fP()  は残り時間を示す \fItimeout\fP 引き数を更新することがある。 \fBpselect\fP()  はこの引き数を変更しない。
97 .TP 
98 (iii)
99 \fBselect\fP()  は \fIsigmask\fP 引き数を持たない。その動作は \fIsigmask\fP に NULL を指定した場合の
100 \fBpselect\fP()  と同じである。
101 .PP
102 3 つの独立したファイルディスクリプタ集合の監視を行う。 \fIreadfds\fP に入れられたディスクリプタについては、読み込みが可能かどうかを 監視する
103 (より正確にいうと、停止 (block) なしで読むことができるかを 調べる。ファイルの終端 (end\-of\-file) の場合も、
104 ファイルディスクリプタは読み込み可能として扱われる)。 \fIwritefds\fP に入れられたディスクリプタについては、停止せずに書き込みが
105 可能かどうかを監視する。 \fIexceptfds\fP にあるものについては、例外の監視を行なう。システムコール終了時に、
106 どのファイルディスクリプタの状態が実際に変化したか示すために、 集合の内容が変更される。
107 ある種別のイベントを監視したいファイルディスクリプタが一つもない場合には、 対応するファイルディスクリプタ集合に NULL を指定することができる。
108 .PP
109 集合を操作するために 4 つのマクロが提供されている。 \fBFD_ZERO\fP()  は集合を消去する。 \fBFD_SET\fP()  と
110 \fBFD_CLR\fP()  はそれぞれ指定したファイルディスクリプタの集合への追加、削除を行う。 \fBFD_ISSET\fP()
111 は集合にファイルディスクリプタがあるかどうか調べる; このマクロは \fBselect\fP()  が終了した後に使うと便利である。
112 .PP
113 \fInfds\fP は 3 つの集合に含まれるファイルディスクリプタの最大値に 1 を足したものである。
114 .PP
115 \fItimeout\fP は \fBselect\fP()  が復帰するまでの経過時間の上限である。 \fItimeval\fP 構造体の両方のフィールドが 0
116 の場合、 \fBselect\fP()  はすぐに復帰する (この機能はポーリング (polling) を行うのに便利である)。 \fItimeout\fP に
117 NULL (タイムアウトなし)  が指定されると、 \fBselect\fP()  は無期限に停止 (block) する。
118 .PP
119 \fIsigmask\fP は、シグナルマスク (\fBsigprocmask\fP(2)  を参照) へのポインタである。 \fIsigmask\fP が NULL
120 でない場合、 \fBpselect\fP()  は \fIsigmask\fP が指しているシグナルマスクで現在のシグナルマスクを置き換えてから、 "select"
121 関数を実行し、 終了後にシグナルマスクを元のシグナルマスクに戻す。
122 .PP
123 \fItimeout\fP 引き数の精度の違いを除くと、以下の \fBpselect\fP()  の呼び出しは、
124 .nf
125
126     ready = pselect(nfds, &readfds, &writefds, &exceptfds,
127                     timeout, &sigmask);
128
129 .fi
130 次のコールを \fIatomic\fP に実行するのと等価である。
131 .nf
132
133     sigset_t origmask;
134
135     sigprocmask(SIG_SETMASK, &sigmask, &origmask);
136     ready = select(nfds, &readfds, &writefds, &exceptfds, timeout);
137     sigprocmask(SIG_SETMASK, &origmask, NULL);
138 .fi
139 .PP
140 \fBpselect\fP()  が必要になる理由は、シグナルやファイルディスクリプタの状態変化を 待ちたいときには、競合状態を避けるために atomic
141 なテストが必要になる からである。 (シグナルハンドラが大域フラグを設定して戻る場合を考えてみよう。 この大域フラグのテストに続けて
142 \fBselect\fP()  を呼び出すと、 シグナルがテストの直後かつ呼び出しの直前に届いた時には \fBselect\fP()
143 は永久にハングしてしまうかもしれない。 一方、 \fBpselect\fP()  を使うと、まずシグナルを禁止 (block)
144 して、入ってくるシグナルを操作し、 望みの \fIsigmask\fP で \fBpselect\fP()  を呼び出すことで、前記の競合を避けることができる。)
145 .SS タイムアウト
146 これらの関数で使用される時間関連の構造体は、 \fI<sys/time.h>\fP で
147
148 .in +4n
149 .nf
150 struct timeval {
151     long    tv_sec;         /* 秒 */
152     long    tv_usec;        /* マイクロ秒 */
153 };
154 .fi
155 .in
156
157
158
159 .in +4n
160 .nf
161 struct timespec {
162     long    tv_sec;         /* 秒 */
163     long    tv_nsec;        /* ナノ秒 */
164 };
165 .fi
166 .in
167
168 のように定義されている。 (POSIX.1\-2001 での定義については下記の「注意」を参照)
169 .PP
170 秒単位以下の精度でスリープを実現する 移植性の高い方法として、 3 つの集合全てを空、 \fInfds\fP を 0 、 \fItimeout\fP を NULL
171 でない値に設定して \fBselect\fP()  を呼び出すという方法を使っているコードもある。
172 .PP
173 .\" .PP - it is rumored that:
174 .\" On BSD, when a timeout occurs, the file descriptor bits are not changed.
175 .\" - it is certainly true that:
176 .\" Linux follows SUSv2 and sets the bit masks to zero upon a timeout.
177 Linux では、 \fBselect\fP()  は \fItimeout\fP を変更し、残りの停止時間を反映するようになっているが、
178 他のほとんどの実装ではこのようになっていない (POSIX.1\-2001 はどちらの動作も認めている)。 このため、 \fItimeout\fP
179 を参照している Linux のコードを他のオペレーティング・システムへ 移植する場合、問題が起こる。 また、ループの中で \fItimeval\fP
180 構造体を初期化せずにそのまま再利用して \fBselect\fP()  を複数回行なっているコードを Linux へ移植する場合にも、問題が起こる。
181 \fBselect\fP()  から復帰した後は \fItimeout\fP は未定義であると考えるべきである。
182 .SH 返り値
183 成功した場合、 \fBselect\fP()  と \fBpselect\fP()  は更新された 3 つのディスクリプタ集合に含まれている
184 ファイルディスクリプタの数 (つまり、 \fIreadfds\fP, \fIwritefds\fP, \fIexceptfds\fP 中の 1 になっているビットの総数)
185 を返す。 何も起こらずに時間切れになった場合、 ディスクリプタの数は 0 になることもある。 エラーならば \-1 を返し、 \fIerrno\fP
186 に適切な値が設定される; 集合と \fItimeout\fP は未定義となるので、エラーが起こった後はそれらの内容を信頼してはならない。
187 .SH エラー
188 .TP 
189 \fBEBADF\fP
190 いずれかの集合に無効なファイルディスクリプタが指定された (おそらくは、すでにクローズされたファイルディスクリプタか、
191 エラーが発生したファイルディスクリプタが指定された)。
192 .TP 
193 \fBEINTR\fP
194 シグナルを受信した。
195 .TP 
196 \fBEINVAL\fP
197 \fIn\fP が負、または \fItimeout\fP に入っている値が不正である。
198 .TP 
199 \fBENOMEM\fP
200 内部テーブルにメモリを割り当てることができなかった。
201 .SH バージョン
202 \fBpselect\fP()  はカーネル 2.6.16 で Linux に追加された。 それ以前は、 \fBpselect\fP()  は glibc
203 でエミュレートされていた (「バグ」の章を参照)。
204 .SH 準拠
205 \fBselect\fP()  は POSIX.1\-2001 と 4.4BSD (\fBselect\fP()  は 4.2BSD で最初に登場した) に準拠する。
206 BSD ソケット層のクローンをサポートしている非 BSD システム (System V 系も含む) との間でだいたい移植性がある。しかし System
207 V 系では たいがい timeout 変数を exit の前にセットするが、 BSD 系ではそうでないので注意すること。
208 .PP
209 \fBpselect\fP()  は POSIX.1g と POSIX.1\-2001 で定義されている。
210 .SH 注意
211 \fIfd_set\fP は固定サイズのバッファである。 負や \fBFD_SETSIZE\fP 以上の値を持つ \fIfd\fP に対して \fBFD_CLR\fP()  や
212 \fBFD_SET\fP()  を実行した場合、 どのような動作をするかは定義されていない。 また、 POSIX では \fIfd\fP
213 は有効なファイルディスクリプタでなければならないと規定されている。
214
215 型宣言に関しては、昔ながらの状況では \fItimeval\fP 構造体の 2 つのフィールドは (上記のように) 両方とも \fIlong\fP
216 型であり、構造体は \fI<sys/time.h>\fP で定義されている。 POSIX.1\-2001 の下では、以下のようになっている。
217
218 .in +4n
219 .nf
220 struct timeval {
221          time_t         tv_sec;     /* 秒 */
222          suseconds_t    tv_usec;    /* マイクロ秒 */
223 };
224 .fi
225 .in
226
227 この構造体は \fI<sys/select.h>\fP で定義されており、データ型 \fItime_t\fP と \fIsuseconds_t\fP は
228 \fI<sys/types.h>\fP で定義されている。
229 .LP
230 プロトタイプに関しては、昔ながらの状況で \fBselect\fP()  を使いたい場合は、 \fI<time.h>\fP
231 をインクルードすればよい。 POSIX.1\-2001 の環境で \fBselect\fP()  と \fBpselect\fP()  を使いたい場合は、
232 \fI<sys/select.h>\fP をインクルードすればよい。
233
234 ヘッダファイル \fI<sys/select.h>\fP は libc4 と libc5 にはなく、glibc 2.0 以降に存在する。
235 悪いことに glibc 2.0 以前では \fBpselect\fP()  のプロトタイプが間違っている。 glibc 2.1 から 2.2.1 では
236 \fB_GNU_SOURCE\fP が定義されている場合に、 \fBpselect\fP()  が提供される。 glibc 2.2.2 以降では、
237 \fBpselect\fP()  を使用するには、「書式」に記載された要件を満たす必要がある。
238 .SS "Linux での注意"
239 Linux の \fBpselect\fP() システムコールは \fItimeout\fP 引き数を変更する。 しかし、
240 glibc のラッパー関数は、システムコールに渡す timeout 引き数 としてローカル変数
241 を使うことでこの動作を隠蔽している。 このため、glibc の \fBpselect\fP() 関数は
242 \fItimeout\fP 引き数を変更しない。 これが POSIX.1\-2001 が要求している動作である。
243 .SH バグ
244 glibc 2.0 では、 \fIsigmask\fP 引き数を取らないバージョンの \fBpselect\fP()  が提供されていた。
245
246 バージョン 2.1 以降の glibc では、 \fBpselect\fP()  は \fBsigprocmask\fP(2)  と \fBselect\fP()
247 を使ってエミュレートされていた。 この実装にはきわどい競合条件において脆弱性が残っていた。 この競合条件における問題を防止するために
248 \fBpselect\fP()  は設計されたのである。 最近のバージョンの glibc では、カーネルがサポートしている場合には、 (競合が起こらない)
249 \fBpselect\fP()  システムコールが使用される。
250
251 \fBpselect\fP()  がないシステムにおいて、 シグナルの捕捉を信頼性があり (移植性も高い) 方法で行うには、 自己パイプ
252 (self\-pipe) という技を使うとよい (シグナルハンドラはパイプへ 1 バイトのデータを書き込み、同じパイプのもう一端をメインプログラムの
253 \fBselect\fP()  で監視するという方法である)。
254
255 .\" Stevens discusses a case where accept can block after select
256 .\" returns successfully because of an intervening RST from the client.
257 .\" Maybe the kernel should have returned EIO in such a situation?
258 Linux では、 \fBselect\fP()  がソケットファイルディスクリプタで "読み込みの準備ができた" と報告した場合でも、 この後で read
259 を行うと停止 (block) することがある。このような状況は、 例えば、データが到着したが、検査でチェックサム異常が見つかり廃棄された時
260 などに起こりえる。他にもファイルディスクリプタが準備できたと間違って 報告される状況が起こるかもしれない。
261 したがって、停止すべきではないソケットに対しては \fBO_NONBLOCK\fP を使うとより安全であろう。
262
263 Linux では、 \fBselect\fP()  がシグナルハンドラにより割り込まれた場合 (つまり \fBEINTR\fP エラーが返る場合)、
264 \fItimeout\fP も変更する。 これは POSIX.1\-2001 では認められていない挙動である。 Linux の \fBpselect\fP()
265 システムコールも同じ挙動をするが、 glibc のラッパー関数がこの挙動を隠蔽している。 具体的には、glibc のラッパー関数の内部で、
266 \fItimeout\fP をローカル変数にコピーし、 このローカル変数をシステムコールに渡している。
267 .SH 例
268 .nf
269 #include <stdio.h>
270 #include <stdlib.h>
271 #include <sys/time.h>
272 #include <sys/types.h>
273 #include <unistd.h>
274
275 int
276 main(void)
277 {
278     fd_set rfds;
279     struct timeval tv;
280     int retval;
281
282     /* stdin (fd 0) を監視し、入力があった場合に表示する。*/
283     FD_ZERO(&rfds);
284     FD_SET(0, &rfds);
285
286     /* 5 秒間監視する。*/
287     tv.tv_sec = 5;
288     tv.tv_usec = 0;
289
290     retval = select(1, &rfds, NULL, NULL, &tv);
291     /* この時点での tv の値を信頼してはならない。*/
292
293     if (retval == \-1)
294         perror("select()");
295     else if (retval)
296         printf("今、データが取得できました。\en");
297         /* FD_ISSET(0, &rfds) が true になる。*/
298     else
299         printf("5 秒以内にデータが入力されませんでした。\en");
300
301     exit(EXIT_SUCCESS);
302 }
303 .fi
304 .SH 関連項目
305 考察と使用例の書かれたチュートリアルとして、 \fBselect_tut\fP(2)  がある。
306 .LP
307 関係がありそうなものを挙げておく: \fBaccept\fP(2), \fBconnect\fP(2), \fBpoll\fP(2), \fBread\fP(2),
308 \fBrecv\fP(2), \fBsend\fP(2), \fBsigprocmask\fP(2), \fBwrite\fP(2), \fBepoll\fP(7),
309 \fBtime\fP(7)