select関数メモ
現代のプログラムでは、select よりは poll または epoll や kevent を使うべき
(POSIX だと poll 限定)
code:c
int select(int nfds, fd_set *restrict readfds,
fd_set *restrict writefds, fd_set *restrict errorfds,
struct timeval *restrict timeout);
fd_set 構造体は実装依存
少なくとも FD_SETSIZE までのファイルディスクリプタを扱うことができる。
FD_SETSIZE 以上の番号のファイルディスクリプタが生成されることがある。(!)
Linux(?) では /usr/include/linux/posix_types.h に以下のように書かれている。
code:/usr/include/linux/posix_types.h
この数字は上書きすることができない。
Windows の場合は64という話がある。
fd_set 構造体は、select に渡す時には、どのfdを検出対象にするか、select から戻ってきた時には、どのfdが有効になっているかを返す。(無効なfdのフラグはクリアされる。)
fd_set fds とした時、
FD_ZERO(&fds) ですべてのフラグをクリアする。
FD_ISSET(fd, &fds) で指定したfdのフラグがセットされているかを判定できる。
FD_SET(fd, &fds) で指定したfdのフラグをセットする。(フラグを立てる)
FD_CLR(fd, &fds) で指定したfdのフラグをクリアする。(フラグを下げる)
select は0番から nfds - 1 番までのfdを判定対象とする。
readfds は読み込み用集合(read, recv で読み込める状態になった)
writefds は書き込み用集合(write, send で書き込める状態になった)
errorfds はエラー用集合(何らかのエラー状態になった)