スポンサーリンク

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) は特定の記 述子 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
引数が無効でした。

関連項目

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

スポンサーリンク