other versions
other sections
POLL(2) | Linux Programmer's Manual | POLL(2) |
名前¶
poll, ppoll - ファイルディスクリプタにおけるイベントを待つ書式¶
#include <poll.h>int poll(struct pollfd *fds, nfds_t nfds, int timeout);#define _GNU_SOURCE /* feature_test_macros(7) 参照 */ #include <poll.h>int ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout_ts, const sigset_t *sigmask);
説明¶
poll() は select(2) と同様の仕事を行う、つまり、ファイルディスクリプタ集合のいずれか一つが I/O を実行可能な状態になるのを待つ。struct pollfd { int fd; /* file descriptor */ short events; /* requested events */ short revents; /* returned events */ };nfds には、 fds 配列の要素数を指定する。
- POLLIN
- 読み出し可能なデータがある。
- POLLPRI
- 読み出し可能な緊急データ (urgent data) がある (例えば、TCP ソケットの帯域外 (out-of-band data) データを受信した場合や、 パケットモードの擬似端末のマスタがスレーブ側の変化を見つけたとき)。
- POLLOUT
- 書き込みが停止 (block) しない状態である。
- POLLRDHUP (Linux 2.6.17 以降)
- ストリームソケットの他端が、コネクションを close したか、 コネクションの書き込み側を shutdown した。 この定義を有効にするには、 (「どの」ヘッダファイルをインクルードするよりも前に) _GNU_SOURCE 機能検査マクロを定義しなければならない。
- POLLERR
- エラー状態 (出力の場合のみ)。
- POLLHUP
- ハングアップした (出力の場合のみ)。
- POLLNVAL
- 不正な要求: fd がオープンされていない (出力の場合のみ)。
- POLLRDNORM
- POLLIN と同じ。
- POLLRDBAND
- 優先帯域データ (priority band data) が読み出し可能である (普通は Linux では使用されない)。
- POLLWRNORM
- POLLOUT と同じ。
- POLLWRBAND
- 優先帯域データ (priority data) が書き込み可能である。
ppoll()¶
poll() と ppoll() の関係は select(2) と pselect(2) の関係と同じようなものである: pselect(2) と同様に、 ppoll() を使うと、アプリケーションはファイルディスクリプタの状態変化 もしくはシグナルの捕捉を安全に待つことができる。 timeout 引き数の精度の違いを除くと、以下の ppoll() の呼び出しは、ready = ppoll(&fds, nfds, timeout_ts, &sigmask);次の呼び出しを atomic に実行するのと等価である。
sigset_t origmask; int timeout; timeout = (timeout_ts == NULL) ? -1 : (timeout_ts.tv_sec * 1000 + timeout_ts.tv_nsec / 1000000); sigprocmask(SIG_SETMASK, &sigmask, &origmask); ready = poll(&fds, nfds, timeout); sigprocmask(SIG_SETMASK, &origmask, NULL);なぜ ppoll() が必要なのかについての説明は pselect(2) の説明を参照のこと。
struct timespec { long tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ };
返り値¶
成功した場合は正の数を返す。この数は 0 以外の revents 要素を持つ構造体の数である (別の言い方をすると、これらのディスクリプタ にはイベントかエラー報告がある)。 値 0 は、タイムアウトとなり、どのファイルディスクリプタでもイベントが 発生しなかったことを示す。エラーの場合は -1 が返され、 errno が適切に設定される。エラー¶
- EFAULT
- 引き数として指定した配列が、呼び出したプロセスのアドレス空間に 含まれていない。
- EINTR
- 要求されたイベントのどれかが起こる前にシグナルが発生した。 signal(7) 参照。
- EINVAL
- nfds の値が RLIMIT_NOFILE を超えた。
- ENOMEM
- ファイルディスクリプタ・テーブルを確保するためのメモリがない。
バージョン¶
poll() システムコールは Linux 2.1.23 で導入された。 このシステムコールが存在しない古いカーネルでは、 glibc (や古い Linux libc) は select(2) を使用して poll() ラッパー関数のエミュレーションを行う。準拠¶
poll() は POSIX.1-2001 に準拠している。 ppoll() は Linux 固有である。注意¶
いくつかの実装では、値 -1 を持った非標準の定数 INFTIM が定義されており、 poll() の timeout の指定に使用できる。 この定数は glibc では定義されていない。Linux での注意¶
Linux の ppoll() システムコールは timeout_ts 引き数を変更する。 しかし、glibc のラッパー関数は、システムコールに渡す timeout 引き数 としてローカル変数を使うことでこの動作を隠蔽している。 このため、glibc の ppoll() 関数では timeout_ts 引き数は変更されない。バグ¶
select(2) の「バグ」の節に書かれている、誤った準備完了通知 (spurious readiness notifications) についての議論を参照のこと。関連項目¶
select(2), select_tut(2), time(7)この文書について¶
この man ページは Linux man-pages プロジェクトのリリース 3.41 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2012-05-05 | Linux |