ポーリング・サブルーチン

目的

複数のファイル記述子およびメッセージ・キューの入出力状況を検査します。

ライブラリー

標準 C ライブラリー (libc.a)

構文

#include <sys/poll.h>
#include <sys/select.h>
#include <sys/types.h>
int poll( ListPointer Nfdsmsgs Timeout)
void *ListPointer;
unsigned long Nfdsmsgs;
long Timeout;

説明

pollサブルーチンは、指定されたファイル記述子とメッセージキューをチェックし、それらが読み込み(受信)または書き込み(送信)の準備ができているかどうか、あるいは例外的な状態が保留されているかどうかを確認する。 OPEN_MAX個のファイル記述子が利用可能であるにもかかわらず、このサブルーチンではFD_SETSIZE個のファイル記述子しかアクセスできない。

注意: pollサブルーチンは、キャラクタ・デバイス、パイプ、メッセージ・キュー、ソケットにのみ適用される。 すべてのキャラクター・デバイス・ドライバーがサポートしているわけではありません。 特定のデバイス・ドライバがpollサブルーチンやselectサブルーチンをサポートしているかどうか、またどのようにサポートしているかについては、個々のキャラクタ・デバイスの説明を参照してください。

このオペレーティング・システムの以前のリリースやBSDシステムとの互換性のために、selectサブルーチンもサポートされている。

メッセージ・キュー・サポートを使用する必要があるプログラムでは、-D_MSGQSUPPORTコンパイル・フラグを指定してソース・コードをコンパイルする必要がある。

パラメーター

項目 説明
ListPointer pollfd構造体、pollmsg構造体、またはapollist構造体の配列へのポインタを指定する。 各構造は、ファイル記述子またはメッセージ・キュー ID と、このファイルまたはメッセージ・キューの対象となるイベントを指定します。 pollfd pollmsg、および pollist構造体は/usr/include/sys/poll.hファイルで定義されている。 ポーリスト構造を使用する場合は、以下のような構造をユーザー・プログラムで定義する必要がある。 pollfd構造体はpollmsg構造体の前になければならない。
struct pollist {
   struct pollfd fds[3];
   struct pollmsg msgs[2];
   } list;

この構造体は次のように初期化できる:

list.fds[0].fd = file_descriptorA;
list.fds[0].events = requested_events;
list.msgs[0].msgid = message_id;
list.msgs[0].events = requested_events;

fds配列とメッセージ配列の残りの要素も同様に初期化できる。 そして、次のようにpollサブルーチンを呼び出すことができる:

nfds = 3;   /* number of pollfd structs */
nmsgs = 2;   /* number of pollmsg structs */
timeout = 1000   /* number of milliseconds to timeout */
poll(&list, (nmsgs<<16)|(nfds), 1000);

Nfdsmsgsパラメータの計算には、fds配列とmsgs配列の正確な要素数を使わなければならない。

Nfdsmsgs (Nfdsmsgs) ファイル記述子の数と、検査するメッセージ・キューの正確な数を指定します。 下位16ビットはpollfd構造体の配列の要素数を示し、上位16ビットは pollmsg構造体の配列の正確な要素数を示す。 Nfdsmsgsパラメータのどちらか半分が0に等しい場合、対応する配列は存在しないものとみなされる。
タイムアウト 指定されたイベントの少なくとも 1 つが発生するのを待機する最大時間 (ミリ秒) を指定します。 Timeoutパラメータ値が-11の場合、指定されたイベントが少なくとも1つ発生するまで、ポーリングサブルーチンはリターンしない。 Timeoutパラメータの値が0である場合、pollサブルーチンはイベントの発生を待たず、指定されたイベントが1つも発生しなかったとしても即座にリターンする。

poll サブルーチン STREAMS 拡張機能

上述の関数に加え、pollサブルーチンは、オープン・ストリームを参照するファイル・ディスクリプタのセット上で入出力を多重化する。pollサブルーチンは、メッセージの送受信が可能なストリーム、または特定のイベントが発生したストリームを特定する。

readサブルーチンやgetmsgシステムコールを使ってメッセージを受け取ることができる。writeサブルーチンやputmsgシステムコールを使ってメッセージを送ることができる。I_RECVFDや I_SENDFDなどの特定のstreamio操作は、メッセージの送受信にも使用できる。 streamioの操作を参照。

ListPointerパラメータは、検査するファイル記述子と、各ファイル記述子の対象イベントを指定する。 これは、対象となるオープン・ファイル記述子ごとに 1 つのエレメントを持つ配列を指します。 配列の要素はpollfd構造体である。 ユーザ/含む/システム/poll.hファイルの'ポルフド構造体に加えて、STREAMSは以下のメンバーをサポートしている:

int fd;             /*  file descriptor  */ short events;       /* requested events */ short revents;      /* returned events  */

このfdフィールドは開いているファイル記述子を指定しeventsおよびreventsフィールドは、以下のイベントフラグの任意の組み合わせをORすることで構築されるビットマスクである:

項目 説明
POLLIN 非優先メッセージまたはファイル記述子受け渡しメッセージが、ストリーム・ヘッド読み取りキューに存在する。 このフラグは、メッセージの長さが 0 であっても設定されます。 ではreventsこのフラグはPOLLPRIフラグと排他的である。 I_RECVFDコマンドを参照。
POLLRDNORM 非優先メッセージがストリーム・ヘッド読み取りキューに存在する。
POLLRDBAND ストリームヘッドのリード・キューに優先メッセージ(band > 0)が存在する。
POLLPRI 優先順位の高いメッセージがストリーム・ヘッド読み取りキューにあります。 このフラグは、メッセージの長さが 0 であっても設定されます。 ではreventsこのフラグはPOLLINフラグと排他的である。
POLLOUT ストリーム内の最初のダウンストリーム書き込みキューがいっぱいではありません。 通常優先順位のメッセージはいつでも送信できます。 putmsgシステムコールを参照のこと。
POLLWRNORM POLLOUTと同じ。
POLLWRBAND ダウンストリームには0より大きいプライオリティ・バンドが存在し、プライオリティ・メッセージはいつでも送ることができる。
POLLMSG SIGPOLLシグナルを含むメッセージが、ストリームヘッドの読み取りキューの先頭に到達した。

戻り値

正常に終了すると、 pollサブルーチンは、選択基準を満たすファイル記述子とメッセージキューの総数を示す値を返す。 戻り値はNfdsmsgsパラメータと似ているが、下位16ビットはファイルディスクリプタの数、上位16ビットはメッセージキュー識別子のうち非ゼロのものの数であるreventsVALUES。 sys/select.hファイルにあるNFDSマクロとNMSGSマクロは、戻り値からこれら2つの値を分離するために使用できる。 NFDSマクロはNFDS#を返し、ここで返される数字は何らかのイベントやエラーを報告しているファイルの数を示し、NMSGSマクロはNMSGS #を返し、ここで返される数字は何らかのイベントやエラーを報告しているメッセージキューの数を示す。

値0は、 ポーリング・サブルーチンがタイムアウトし、指定されたファイルまたはメッセージ・キューのどれもがイベントの存在を示さなかったことを示す(すべてreventsフィールドの値は0)。

失敗した場合は-1が返され、エラーを示すグローバル変数errnoが設定される。

エラー・コード

以下の1つ以上が真である場合、pollサブルーチンは正常に実行されません:

項目 説明
EAGAIN 内部データ構造の割り振りが失敗しました。
EINTR pollシステム・コール中にシグナルがキャッチされ、サブルーチンが再起動されないようにシグナル・ハンドラがインストールされた。
EINVAL Nfdsmsgsパラメータで指定されたpollfd構造体の数がFD_SETSIZE より大きい。 Nfdsmsgsパラメータで指定された pollmsg構造体の数が、許容されるメッセージ・キューの最大数よりも大きい場合も、このエラーが返される。
EFAULT ListPointerパラメータは、Nfdsmsgsパラメータと組み合わせて、プロセスの割り当てられたアドレス空間の外の場所をアドレス指定する。