EN JA
SELECT(2)
SELECT(2) FreeBSD System Calls Manual SELECT(2)

名称

select同期的な入出力の多重化

ライブラリ

Standard C Library (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) は特定の記述子 fdfdset に含めます。 FD_CLR( fd, &fdset) は fdfdset から削除します。 FD_ISSET( fd, &fdset) は fdfdset のメンバである場合は非 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]
readfds, writefds, exceptfds または timeout の引数の 1 つが無効なアドレスを指しています。
[ EINTR]
タイムリミットが切れる前あるいは選択したイベントのいずれかが起きる前に、シグナルが配送されました。
[ EINVAL]
指定のタイムリミットは無効です。どれかが負であるか、または大きすぎます。
[ EINVAL]
nfds 引数が無効でした。

FD_SETSIZE のデフォルトのサイズは現時点では 1024 です。多数のオープンファイルを使用する可能性があるプログラムで select() を実行するために、 < sys/types.h> を取り込むヘッダを含める前にプログラムで FD_SETSIZE を定義することで、このサイズを増加できます。

nfds がオープンファイルの数より大きい場合、 select() が未使用のファイル記述子を調査することは保証されていません。歴史的な理由で、 select() は最初の 256 個の記述子を必ず調査します。

規格

select() システムコールおよび FD_CLR(), FD_ISSET(), FD_SET(), FD_ZERO() マクロは IEEE Std 1003.1-2001 (“POSIX.1”) に適合します。

歴史

select() システムコールは 4.2BSD で登場しました。

バグ

Version 2 of the Single UNIX Specification (“SUSv2”) では、システムが元の timeout を適当に更新することを許しています。したがって、タイムアウトの値が select() システムコールによって変更されないと想定するのは賢明ではありません。 FreeBSD は、他のシステムから移植されたアプリケーションのために問題を起こすかもしれない、返り値を変更しません。
November 17, 2002 FreeBSD