SELECT(2) FreeBSD システムコールマニュアル SELECT(2)
名称
select − 同期的な入出力の多重化 |
ライブラリ
標準 C ライブラリ (libc, −lc) |
書式
#include <sys/select.h> int |
select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); |
FD_SET(fd, &fdset); |
FD_CLR(fd, &fdset); |
FD_ISSET(fd, &fdset); |
FD_ZERO(&fdset); |
解説 |
select() システムコールは、 readfds, writefds および exceptfds でアドレス を渡された入出力記述子集合を調べ、それらの記述子のいくつかがそれぞれ、読 取り準備完了であるか、書込み準備完了であるか、または保留されている例外条 件があるかを調べます。検出可能な唯一の例外条件は、ソケット上に受信した帯 域外のデータです。最初の nfds 個の記述子が各集合内でチェックされます。す なわち、記述子集合中の 0 〜 nfds-1 の記述子が調べられます。戻り時に select() システムコールは指定の記述子集合を、要求された操作の準備ができて いる記述子で構成される部分集合で置き換えます。 select() は、すべての集合 の中で準備ができた記述子の総数を返します。 記述子の集合は、整数配列内のビットフィールドとして保存されます。このよう な記述子集合を操作するために次のマクロが用意されています: FD_ZERO(&fdset) は記述子集合 fdset を空集合で初期化します。 FD_SET(fd, &fdset) は特定の記 述子 fd を fdset に含めます。 FD_CLR(fd, &fdset) は fd を fdset から削除 します。 FD_ISSET(fd, &fdset) は fd が fdset のメンバである場合は非 0 の 値を、そうでない場合は 0 を返します。これらのマクロの動作は、記述子の値が 0 未満であるか、または FD_SETSIZE 以上である場合は未定義です。 FD_SETSIZE は通常、少なくとも、システムがサポートする記述子の最大数に等しくなりま す。 timeout が、NULL ポインタでない場合、それはセレクションの完了を待つ最大間 隔を指定します。システムの活動性が、この間隔を不定時間延長することがあり ます。 timeout が NULL ポインタの場合、 select() は無期限にブロックします。 ポーリングのためには、 timeout 引数は NULL でなく、値が 0 の timeval 構造 体を指しているべきです。 readfds, writefds および exceptfds のどれについても、いずれの記述子も興味 がない場合は NULL ポインタを指定できます。 |
戻り値
select() システムコールは記述子集合に含まれている準備のできた記述子の数を 返し、エラーが起きた場合は -1 を返します。タイムリミットが来ると、 select() は 0 を返します。システムコールの割り込まれることによるものも含 めて select() がエラーで戻る場合は、記述子集合は変更されません。 |
エラー
select() から戻るエラーは次のことを示します: |
[EBADF]
記述子集合のどれかが無効な記述子を指定していました。 [EFAULT] [EINTR] [EINVAL] [EINVAL] 関連項目 |
accept(2), connect(2), getdtablesize(2), gettimeofday(2), kqueue(2), poll(2), read(2), recv(2), send(2), write(2), clocks(7) |
注
FD_SETSIZE のデフォルトのサイズは現時点では 1024 です。多数のオープンファ イルを使用する可能性があるプログラムで select() を実行するために、 <sys/types.h> を取り込むヘッダを含める前にプログラムで FD_SETSIZE を定義 することで、このサイズを増加できます。 nfds がオープンファイルの数より大きい場合、 select() が未使用のファイル記 述子を調査することは保証されていません。歴史的な理由で、 select() は最初 の 256 個の記述子を必ず調査します。 |
バグ
Version 2 of the Single UNIX Specification (‘‘SUSv2’’) では、システムが元 の timeout を適当に更新することを許しています。したがって、タイムアウトの 値が select() システムコールによって変更されないと想定するのは賢明ではあ りません。 |
規格
select() システムコールおよび FD_CLR(), FD_ISSET(), FD_SET(), FD_ZERO() マクロは IEEE Std 1003.1-2001 (‘‘POSIX.1’’) に適合します。 |
歴史
select() システムコールは 4.2BSD で登場しました。 FreeBSD 10.0 November 17, 2002 FreeBSD 10.0 |