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にあるサンプルがわかりやすい。

  1. FD_ZEROマクロでfd_setを初期化
  2. FD_SETマクロでfd_setにファイルディスクリプタを登録
  3. selectで引数に指定したfd_setがreadyになるのを待つ
  4. FD_ISSETマクロでfd_setにファイルディスクリプタがあるかチェックする

poll(2)

#include <poll.h>
int poll(struct pollfd *fds, nfds_t nfds, int timeout);

poll() は select(2) と同様の仕事を行う、つまり、ファイルディスクリプタ集合のいずれか一つが I/O を実行可能な状態になるのを待つ。