poll
複数のファイルディスクリプタを監視するシステムコール
ファイル、パイプ、デバイス、メッセージキュー etc
selectシステムコールの改良版
I/Oの多重化ができる
ソケット通信で使われる
POSIXに定義されているのでどこでも使える
code:memo.c
#include <poll.h>
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
int ppoll(struct pollfd *fds, nfds_t nfds,
const struct timespec *tmo_p, const sigset_t *sigmask);
code:c
struct pollfd {
int fd; /* file descriptor */
short events; /* requested events */
short revents; /* returned events */
};
pollfd.fd
監視したいオープンされたファイルディスクリプタを指定
pollfd.events
ファイルディスクリプタの監視するイベントを指定する
pollfd.revents
ファイルディスクリプタに実際に起こったイベントがカーネルにより設定される
events, reventsに設定されるイベント
POLLIN
読み出し可能なデータがある。
POLLPRI
読み出し可能な緊急データ (urgent data) がある (例えば、TCP ソケットの帯域外 (out-of-band data) データを受信した場合や、 パケットモードの擬似端末のマスタがスレーブ側の変化を見つけたとき)。
POLLOUT
書き込みが停止 (block) しない状態である。
POLLRDHUP (Linux 2.6.17 以降)
ストリームソケットの他端が、コネクションを close したか、 コネクションの書き込み側を shutdown した。 この定義を有効にするには、 (「どの」ヘッダファイルをインクルードするよりも前に) _GNU_SOURCE 機能検査マクロを定義しなければならない。
POLLERR
エラー状態 (出力の場合のみ)。
POLLHUP
ハングアップした (出力の場合のみ)。
POLLNVAL
不正な要求: fd がオープンされていない (出力の場合のみ)。
pollを使ったプログラムの例
linux-system-programming/src/poll-example.c at master · raoulmillais/linux-system-programming
確認用
Q. pollとは
Q. pollを使ったサンプルプログラムを作成
関連
epoll
select
errno.h
ポーリング
C10K問題
参考
Man page of POLL
man poll (2): ファイルディスクリプタにおけるイベントを待つ
8-18 poll()を利用したデータ受信プログラム:Geekなぺーじ
#LInuxネットワークプログラミング #ソケット通信