POLL(2)

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

ライブラリ
libc

書式
<poll.h> int poll(struct pollfd fds[], nfds_t 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), kqueue(2), read(2), recv(2), select(2), send(2), write(2)

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

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