EN JA
POLL(2)
POLL(2) FreeBSD System Calls Manual POLL(2)

名称

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

ライブラリ

Standard C Library (libc, -lc)

書式

#include < 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;  /* 返されたイベント */ 
};

struct pollfd のフィールドは次のとおりです:

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

eventsrevents 内のビットマスクには次のビットがあります:

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]
時間制限として負の値が指定されました。

歴史

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

バグ

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