select(2), poll(2)
引き続き、MIT Open Courseware。
select(2)
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout, const sigset_t *sigmask);
プログラムで複数のファイルディスクリプタを監視し、 一つ以上のファイルディスクリプタがある種の I/O 操作の 「ready (準備ができた)」状態 (例えば、読み込み可能になった状態) になるまで待つことができる。 ファイルディスクリプタが ready (準備ができた) とは、 対応する I/O 操作 (例えば read(2) など) が停止 (block) なしに実行可能な状態にあることを意味する。
manにあるサンプルがわかりやすい。
- FD_ZEROマクロでfd_setを初期化
- FD_SETマクロでfd_setにファイルディスクリプタを登録
- selectで引数に指定したfd_setがreadyになるのを待つ
- FD_ISSETマクロでfd_setにファイルディスクリプタがあるかチェックする
poll(2)
#include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout);
poll() は select(2) と同様の仕事を行う、つまり、ファイルディスクリプタ集合のいずれか一つが I/O を実行可能な状態になるのを待つ。