c++におけるselect関数の使用方法を教えてください。
C++では、select()関数は一連のファイル記述子を監視して、それらが読み取り可能か、書き込み可能か、エラー状態にあるかを判断します。select()関数の基本的な手順を次に示します。
- ヘッダーのインクルード: <sys/time.h> と <sys/types.h> ヘッダーのインクルードが必要です。
- fd_set変数を作成して初期化します: fd_setはファイル記述子を保存する集合であり、使用する前にfd_set型の変数を作成して初期化して、監視するファイル記述子を保存する必要があります。
- FD_SETマクロを用いた監視ファイル記述子の設定 FD_SET(fd, &fdset) マクロを用いて、fd に監視対象のファイル記述子を追加する。
- select 関数にタイムアウト時間が設定可能(タイムアウト時間の設定:timeval 構造体の tv_sec、tv_usec フィールドの設定)
- select関数を呼び出す:select(maxfd + 1, &readfds, &writefds, &errorfds, &timeout)の形式でselect関数を呼び出す。maxfdは監視する最大のファイルディスクリプタ+1、readfds, writefds, errorfdsはそれぞれ読み込み可能なファイルディスクリプタの集合、書き込み可能なファイルディスクリプタの集合、エラー状態のファイルディスクリプタの集合を表す。timeoutはタイムアウト時間である。
- select()関数は、イベントが発生したファイルディスクリプタの数を返します。エラーが発生すると -1、タイムアウトすると 0、正の整数はイベントが発生したファイルディスクリプタの数を返します。
- 返されるファイル記述子の処理:FD_ISSET マクロを使って特定のファイル記述子が読み取り可能か、書き込み可能か、エラーがあるかを判定し、FD_CLR マクロを使って特定のファイル記述子を fd_set から削除します。
以下に簡単なサンプルコードを示します
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <iostream>
int main() {
fd_set readfds;
FD_ZERO(&readfds); // 初始化fd_set变量
int fd = 0; // 例如,监视标准输入
FD_SET(fd, &readfds); // 将标准输入添加到fd_set中
timeval timeout;
timeout.tv_sec = 5; // 设置超时时间为5秒
timeout.tv_usec = 0;
int result = select(fd + 1, &readfds, NULL, NULL, &timeout); // 调用select()函数
if (result == -1) {
std::cout << "select() error" << std::endl;
} else if (result == 0) {
std::cout << "timeout" << std::endl;
} else {
if (FD_ISSET(fd, &readfds)) { // 判断标准输入是否可读
std::cout << "stdin is ready" << std::endl;
}
}
return 0;
}
このコードは、標準入力を監視して、タイムアウト時間内に結果を返します。