select

昔, 講義でやった覚えが・・・って程度しか記憶にない.
ちょうど, 説明が載ってる本を図書館で借りているので, メモ.



同期通信と非同期通信が関係していると.
同期通信は, データが飛んでくるまで待つ.
よって, 何時データが飛んでくるか分からないようなものには向かない.
非同期通信は, データが届いているかどうかを確認して受信する.
(これでいいのかな?)


書式はこんな感じか.
(つか, 本のまる写しだけど.)

 int select( int fdwidth, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout )

 int               fdwidth;    チェックするファイル記述子の最大個数
 int*              readfds;    読み出し用ファイル記述子の集合へのポインタ
 int*             writefds;    書き込み用フィアル記述子の集合へのポインタ
 int*            exceptfds;    例外条件が発生しているファイル記述子の集合へのポインタ
 struct timeval*   timeout;    最大の待ち時間を表す timeval 構造体へのポインタ

 return :
    正常終了 -> 入出力の準備ができているファイル記述子の数
    エラー   -> -1 を返戻. 外部変数 errno にエラーを示す値をセット.

第1引数「fdwidth」には, 入出力可能かどうか監視させたい記述子の最大数 + 1 を指定.
第2引数から第4引数.
ファイル記述子の集合を操作するために4つのマクロが用意されている.

 FD_ZERO ( fd_set &fds )          : 集合 fds をゼロクリアする
 FD_SET  ( int fd, fd_set &fds )  : 集合 fds にファイル記述子fdを設定する
 FD_CLR  ( int fd, fd_set &fds )  : 集合 fds からファイル記述子を解除する
 FD_ISSET( int fd, fd_set &fds )  : 集合 fds の中のファイル記述子 fd が入出力可能(真)かどうかを調べる

第5引数「timeout」では, 引数2-4までで与えた記述子が入出力可能になるまで最大でどのくらい待つのかを指定する.
指定した時間内に, 引数に指定したファイル記述子のいずれかが入出力可能になると, select システムコールから戻る.
timeval 構造体の書式

struct timeval {
    _time_t       tv_sec; // 秒
    _suseconds_t tv_usec; // マイクロ秒
}

「_time_t」と「_suseconds_t」は, long intと同じ意味を持つ.
この timeout に「NULL」を指定すると, select システムコールはいずれかの記述が入出力可能になるまで無期限にブロックする.

参考にした本