POLL(2)

名称
poll - 同期的な入出力の多重化

ライブラリ
libc

書式
<sys/types.h> <poll.h> int poll(struct pollfd *fds, unsigned int nfds, int timeout)

解説
poll() はファイル記述子の集合を調査して、 それらのいずれかで入出力の準備ができているか否かを調べます。 fds 引数は <poll.h> で定義された pollfd 配列を指す ポインタ (後述) です。 nfds 引数は fds 配列のサイズを決定します。

    struct pollfd {
        int    fd;       /* ファイル記述子 */
        short  events;   /* 検索するイベント */
        short  revents;  /* 返されたイベント */
    };

pollfd 構造体のフィールドは次のとおりです:

fd  調査するファイル記述子。もし fd が -1 なら revents はクリアされ (0 に設定)、pollfd はチェックされません。

events
    調査するイベント (後述)。

revents
    発生したイベント (後述)。

events と revents 内のビットマスクには次のビットがあります。

POLLIN
    高優先データ以外のデータはブロックせずに読取りできます。

POLLRDNORM
    通常データはブロックせずに読取りできます。

POLLRDBAND
    優先順位が 0 でないデータはブロックせずに読取りできます。

POLLPRI
    高優先データはブロックせずに読取りできます。

POLLOUT

POLLWRNORM
    通常データはブロックせずに書込みできます。

POLLWRBAND
    優先順位が 0 でないデータはブロックせずに書込みできます。

POLLERR
    デバイスまたはソケット上に例外状態が起きました。このフラグは、 events ビットマスクに存在していなくても必ずチェックされます。

POLLHUP
    デバイスまたはソケットが切断されています。このフラグは、 events ビットマスク内に 存在しなくても必ずチェックされます。 POLLHUP と POLLOUT は、 revents ビットマスク内に同時に存在する ことが決してないことに注意してください。

POLLNVAL
    ファイル記述子がオープンされていません。このフラグは、 events ビットマスク内に存在しな くても必ずチェックされます。

timeout が 0 でも INFTIM (-1) でもない場合、 この値はいずれかのファイル記述子が準備完了になるのを 待機する最大インターバル (ミリ秒単位) です。 timeout が INFTIM (-1) の場合、 poll() は無期限にブロックします。 timeout が 0 の場合 poll() はブロックせずに戻ります。

戻り値
poll() は入出力の準備が完了した記述子の番号を返します。 エラーが起きた場合は -1 を返します。 時間切れになると poll() は 0 を返します。割り込み呼び出しによるエラーも含めて poll() がエラーで戻った場合、 fds 配列は変更されません。

互換性
この実装は、ファイル記述子によって poll() がエラーにならないという点で、 過去のものと異なっています。 過去の実装においてエラーになるであろう場合 (たとえば revoke(2) された記述子を検査しようとした場合)、この実装は代わりに events ビットマスクを revents ビットマスクにコピーします。 この記述子上で入出力を実行しようとするとエラーが返されます。 この動作はより便利であると考えられています。

エラー
poll() は次のエラーで戻ります。

[EFAULT]
    fds は、プロセスに割り当てられたアドレス空間の範囲外を指しています。

[EINTR]
    時間切れになる前に、そして選択されたイベントが発生する前に シグナルを受信しました。

[EINVAL]
    時間制限として負の値が指定されました。

関連項目
accept(2), connect(2), read(2), recv(2), select(2), send(2), write(2)

バグ
events ビットマスクと revents ビットマスクのいくつかのフィールド間の違いは、 STREAMS 以外では実用的ではありません。 それらのフィールドは、既存のソフトウェアとの互換性を 保つために定義されています。

歴史
poll() 関数は AT&T UNIX で登場しました。 このマニュアルページと実装の主要な部分は NetBSD から得たものです。