Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ select(2) — NEWS-os 4.2.1R

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

accept(2)

connect(2)

read(2)

write(2)

recv(2)

send(2)

getdtablesize(2)

SELECT(2)  —  NEWS-OS Programmer’s Manual

名称

select − 同期的な入出力の選択

形式

#include <sys/types.h>
#include <sys/time.h>

nfound = select(nfds, readfds, writefds, exceptfds, timeout)
int nfound, nfds;
fd_set ∗readfds, ∗writefds, ∗exceptfds;
struct timeval ∗timeout;

FD_SET(fd, &fdset)
FD_CLR(fd, &fdset)
FD_ISSET(fd, &fdset)
FD_ZERO(&fdset)
int fd;
fd_set fdset;

解説

select は、 readfds、 writefds、 exceptfds で渡されたアドレスの入出力ディスクリプタのセット、 すなわち集まりを 調べ、 現在それらのディスクリプタのうちの、 どれが即座に読取りに応じられる状態にあるのか、 どれが即座に書き込みに応じられる状態にあるのか、 または、 どれがペンディングとなっている例外条件を 持っているのかをつきとめます。 各ディスクリプタセットの最初の nfds 個のディスクリプタがチェックされます。 つまり、該当するディスクリプタセットにある 0 から nfds−1 までのディスクリプタが調べられます。 リターン時に、 select は、与えられたディスクリプタのセットを、 要求されたオペレーションに対してレディーとなっている ディスクリプタで構成されたサブセットで置き換えます。 すべてのディスクリプタセット内でレディー状態にあるディスクリプタの総数が nfound へ返されます。

ディスクリプタセットは、 整数配列内にビットフィールドとして収められます。 そのようなディスクリプタセットを 操作するために、 いくつかのマクロが提供されています。 マクロ FD_ZERO(&fdset) は、 ディスクリプタセット fdset を ナルのセットに初期設定します。 FD_SET(fd,&fdset) は、 fdset に特定のディスクリプタ fd を セットします。 FD_CLR(fd,&fdset) は、 fdset から fd を 除去します。 FD_ISSET(fd,&fdset) は、 fd が fdset のメンバである場合には 0 以外になり、 fd が fdset のメンバではない場合には 0 になります。 これらのマクロの働きは、 あるディスクリプタの値がゼロ以下、 または FD_SETSIZE 以上の場合には、 定義されていません。 通常、 FD_SETSIZE は、 少なくともシステムによってサポートされているディスクリプタの 最大数には等しくなっています。

timeout がゼロポインタでない場合、 それは、選択を待って終了するまでの最長のインターバルを指します。 timeout ゼロポインタである場合には、 select はブロックするかもしれません。 ポーリングとして作用させるためには、 timeout 引数は、ゼロポインタ以外であって、 値が 0 の timeval 構造体を指し示している必要があります。

状態を 知る必要のないディスクリプタがある場合には、 readfds および、 writefds、 exceptfds のうちのどれでもゼロのポインタとして与えることができます。

リターン値

select は、 指定されたディスクリプタセットに含まれている、 レディー状態にあるディスクリプタの数を 返します。 エラーが発生した場合には、 −1 を 返します。 タイムリミットに達してしまった場合には、 select は 0 を返します。 select が (割り込みが原因であるエラーも含め) エラーでリターンした場合には、 ディスクリプタセットは修正されません。

エラー

select は次のエラーを 返すことがあります。

[EBADF] ディスクリプタセットのうちの 1 つが無効なディスクリプタを 指定した。

[EINTR] タイムリミットに達する前で、 選択されたイベントのいずれかが発生する前に、 シグナルが送られた。

[EINVAL] 指定されたタイムリミットが無効である。 その構成要素の 1 つが負であるか、 大きすぎる。

関連事項

accept(2), connect(2), read(2), write(2), recv(2), send(2), getdtablesize(2)

バグ

getdtablesize(2) は、 オープンファイル数に対するカーネルの制限にとらわれずにプログラムを 書くことができるようにするために作られたものですが、 select で使われる大きなビットフィールドがある場合、問題があります。 デフォルトのサイズ FD_SETSIZE (現在のところ 256) は、 オープンファイル数に対する現在のカーネルの制限よりは幾分大きくなっています。 しかし、 select を 用いてそれより多い数のオープンファイルを 使用する可能性があるプログラムを 受け入れられるようにするためには、 <sys/types.h> を インクルードする前に FD_SETSIZE を 大きく定義することによって、 プログラム内でこのサイズを 増やすことが可能です。

select は、指定された timeout 時刻までの残り時間を、 timeout に代入して返すべきです。 これは、 システムの将来のバージョンで実現される予定です。 したがって、 select コールによって timeout の値が変更される 可能性を考慮しておいたほうがよいでしょう。

NEWS-OSRelease 4.2.1R

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026