日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトル
目次
まえがき
リファレンス・セクション
   ≫ライブラリ関数一覧
索引
PDF
OpenVMS ホーム

HP OpenVMS
HP C ランタイム・ライブラリ・リファレンス・マニュアル (下巻)


目次 索引




複数のファイル記述子で複数のオープン・ストリームを参照している場合に,それらのファイル記述子に入出力を多重化するためのメカニズムを提供します。

形式

#include <poll.h>

int poll (struct pollfd filedes [], nfds_t nfds, int timeout);


引数



filedes

pollfd構造体の配列を指すポインタ。構造体の一つ一つが,対象となるファイル記述子にそれぞれ対応しています。 pollfd構造体は,次のメンバから構成されています。
int fd ---ファイル記述子
int events ---要求する (つまり報告の対象となる) 条件状況 (イベント)
int revents ---報告される成立条件/状況 (イベント)


nfds

filedes 配列を構成する pollfd構造体の数。

timeout

指定したイベントが少なくとも 1 つ発生するまでに待つことのできる最大時間 (単位はミリ秒)。

説明

poll関数は,複数のファイル記述子で複数のオープン・ストリームを参照している場合に,それらのファイル記述子へ入出力を多重化するためのメカニズムとして使用できます。 pollは, filedesが指す配列の各メンバごと,つまりファイル記述子ごとに, eventsで指定したイベントが発生しているかどうかを調べます。具体的には, poll関数は,アプリケーションがメッセージを送信または受信できるストリームや,あるイベントが発生したストリームを調べます。

対象にするファイル記述子と,各ファイル記述子に対して調べたいイベントは, filedes パラメータで指定します。このパラメータはポインタになっていて, pollfd構造体の配列を指しています。対象となるオープン・ファイルは,この pollfd構造体の fd メンバとして,ファイル記述子で示します。 poll関数は,events メンバを使用してそのファイル記述子の報告すべき条件/状況を調べ,その 1 つまたは複数が真になっていれば, revents メンバに,対応する成立条件/状況を設定します。

pollfd構造体の events メンバと revents メンバは,ビットマスクになっています。 events の値は呼び出しプロセス側が,また,revents の値は poll側がそれぞれ設定します。これらのビットマスクは,条件/状況項目を論理和でまとめたものになっています。条件/状況項目には,次のものがあります。

POLLERR ---そのファイル記述子でエラーが発生した。このオプションは,revents ビットマスクでだけ有効で, events メンバでは指定できません。
対象が STREAMS デバイスの場合は,そのファイル記述子でエラーが発生しているという状況と,デバイスが切断されているという状況が重なっていると, pollから,POLLHUP ではなく POLLERR が返されます。つまり,POLLERR が POLLHUP より優先されます。

POLLHUP ---デバイスが切断された。このイベントと POLLOUT は排他関係にあって,同時に設定されることはありません。ハングアップが発生すると,そのストリームへ書き込めなくなります。このイベントは,POLLIN,POLLRDNORM,POLLRDBAND,または POLLPRI と一緒に設定されることがあります。この条件/状況項目は,revents ビットマスクでだけ有効です。 events メンバにこの条件/状況項目を指定しても,無視されます。

POLLIN ---優先順位の高くないデータを,ブロックしないで読み取れる。この条件/状況項目は,メッセージの長さがゼロであっても,revents に設定されます。 revents にこの条件/状況項目と POLLPRI が同時に設定されることはありません。

POLLNVAL ---fd に指定されている値が無効である。この条件/状況項目は,revents メンバでだけ有効です。 events メンバにこの条件/状況項目を指定しても,無視されます。

POLLOUT ---通常 (優先順位帯域が 0) のデータを,ブロックしないで書き込める。

POLLPRI ---優先順位の高いデータを,ブロックしないで受信できる。この条件/状況項目は,メッセージの長さがゼロであっても,revents に設定されます。 revents にこの条件/状況項目と POLLIN が同時に設定されることはありません。

POLLRDBAND ---優先順位帯域がゼロでないデータを,ブロックしないで読み取れる。この条件/状況項目は,メッセージの長さがゼロであっても,revents に設定されます。

POLLRDNORM ---通常 (優先順位帯域が 0) のデータを,ブロックしないで読み取れる。この条件/状況項目は,メッセージの長さがゼロであっても,revents に設定されます。

POLLWRBAND ---優先データ (優先順位帯域が 0 より大きいデータ) を書き込める。この条件/状況項目でチェックされるのは,書き込みが 1 度でも行われたことのある帯域だけです。

POLLWRNORM ---POLLOUT と同じです。

poll関数は,fd メンバの値がゼロ (0) より小さいと,その pollfd構造体を無視します。また,すべての pollfd構造体の fd メンバが 0 より小さいと,0 を返すだけで,その他の処理はいっさい行いません。

条件/状況項目の POLLNORM と POLLOUT が真になるのは,少なくとも 1 バイトのデータがブロックしないで読み取れるか書き込める場合だけです。ただし,例外が 2 つあります。 1 つは通常ファイルの場合で, POLLNORM と POLLOUT のポーリング結果は必ず真になります。もう 1 つはパイプで,ファイルの終わりを示すためにゼロを返すという処理規則になっている場合です。

条件/状況項目の POLLERR,POLLHUP,および POLLNVAL は,指定されたファイル記述子でその条件が成立していれば, events にその条件が設定されているかどうかに関係なく,必ず revents に設定されます。

poll関数に対して報告される条件/状況項目には, 2 つのタイプがあります。 1 つは,必ず報告される条件/状況項目で,もう 1 つは,events で指定されたときに報告される条件/状況項目です。 poll関数を呼び出すと,これら 2 つのタイプが一緒に報告されます。 poll関数は,これらの条件/状況項目が成立しているファイル記述子があると,そのファイル記述子の revents にそれらの条件/状況項目が成立していることをすべて示して,呼び出し側に制御を戻します。

poll関数は,報告すべき条件/状況項目があってもそれらがまだ 1 つも成立していないと,その条件/状況項目が成立するまで,最大 timeout ミリ秒待ちます。そして,どのファイル記述であるかに関係なくこの待ち時間内に 1 つでも条件/状況項目が成立すれば,そのファイル記述子の revents メンバにその条件/状況項目を設定して戻ります。しかし,待ち時間が過ぎてもそれらの条件/状況項目が成立しないと, pollは, revents ビットマスクを設定しないで戻ります。

timeout パラメータの値として - 1 を指定すると, poll関数は,指定したイベントが少なくとも 1 つ発生するまで戻りません。 timeout パラメータの値として 0 を指定すると, poll関数は,指定したイベントが発生していなくても,そのイベントの発生を待たないで,すぐに戻ります。

poll関数の動作は,指定したファイル記述子に O_NONBLOCK オプションが設定されているかどうかとはいっさい関係ありません。

poll関数では,通常ファイル,ターミナル・デバイス,擬似ターミナル・デバイス,STREAM ベース・ファイル,FIFO,およびパイプをサポートしています。これらとはタイプの異なるファイルを指定,つまりタイプの異なるファイル記述子を指定して pollを行った場合の動作は,規定されていません。

ファイル記述子でソケットを指定して接続をリッスンしている場合は,接続が利用できるようになった時点で読み取れるようになります。また,ファイル記述子でソケットを指定して非同期型の接続を行う場合は,接続が確立した時点で書き込めるようになります。


戻り値

n 成功したことを示します。 n (負でない値) は, poll によって revents ビットマスクが設定されているファイル記述子の数です。
0 poll がタイムアウトしたことを示します。 revents ビットマスクは設定されていません。
-1    エラーが発生したことを示します。 errno に,エラーを示す次のいずれかの値が設定されます。

  • EAGAIN ---内部データ構造体を割り当てられませんでした。 poll を再度呼び出せば,成功する可能性があります。

  • EINTR --- poll 関数の処理中にシグナルが発生したが,そのシグナル・ハンドラでこの関数を再起動しないようになっていました。

  • EINVAL --- nfds パラメータの値が OPEN_MAX より大きいか, fd メンバのいずれかがストリームまたはマルチプレクサを参照していて,そのストリームまたはマルチプレクサが別のマルチプレクサの下流側に直接または間接的にリンクされています。


目次 索引

© 2012 Hewlett-Packard Development Company, L.P.