スポンサーリンク

POLL(2) FreeBSD システムコールマニュアル POLL(2)

名称

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

ライブラリ

標準 C ライブラリ (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]
時間制限として負の値が指定されました。

関連項目

accept(2), connect(2), kqueue(2), read(2), recv(2), select(2), send(2), write(2)

バグ

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

歴史

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

FreeBSD 10.0 July 8, 2002 FreeBSD 10.0

スポンサーリンク