select
selectを使用して複数のファイルディスクリプタからの入出力を制御
selectを使用すると,複数のファイルディスクリプタを監視し,変化があったファイルディスクリプタを処理することができる.また,タイムアウトを設定することもできる.この項ではPF_INET,SOCK_STREAMで作成したソケットと,stdinの状態をselectを使用して監視し,処理する.以下にその流れを示す.
上はselectでソケットを監視する場合の例である.サーバのstdinとソケットを監視する場合,stdinは通常と同様に扱うことができる.
| サーバ | クライアント |
|---|---|
| socket | socket |
| bind | |
| listen | |
| select | connect |
| accept | |
| 何かする | 何かする |
| close | close |
int select(int n,
fd_set *readfds,
fd_set *writefds,
fd_set *exceptfds,
struct timeval *timeout);
selectの引数には,fd_setというファイルディスクリプタの集合がある.そして監視する状態(読み込めるか,書き込めるか,エラー)によって,*readfds,*writefds,*exceptfdsを設定する.nは,これら三つのファイルディスクリプタ集合のうち,最大の「値」(個数ではない)+1を指定する.nの最大値はFD_SETSIZEである.fd_setはいくつかのマクロで設定,制御する.
- FD_CLR(int fd, fd_set *set);
- *setからfdを削除する.
- FD_ISSET(int fd, fd_set *set);
- *setにfdがセットされていれば1を返す.
- FD_SET(int fd, fd_set *set);
- *setにfdをセットする.
- FD_ZERO(fd_set *set);
- *setを空に初期化する.
$ ./server 127.0.0.1 9999 TIMEOUT TIMEOUT client-fuga TIMEOUT client-hoge TIMEOUT server TIMEOUT -hoge server-hoge ser TIMEOUT ver-fuga server-fuga TIMEOUT exit exitそしてクライアント
$ ./client 127.0.0.1 9999 client-fuga $ ./client 127.0.0.1 9999 client-hogeサーバでは2秒でselectがタイムアウトしてTIMEOUTを出力する.そして2秒以内にソケットかstdinからの入力があればそれを出力する.上は
- サーバを起動
- クライアントを実行
- クライアントを実行
- サーバの標準入力
- サーバの標準入力
- サーバの標準入力(exit)

