日本-日本語

製品  >  ソフトウェア  >  OpenVMS  >  マニュアル >  V8.3ライブラリ

OpenVMS マニュアル


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


前へ 次へ 目次 索引


他のファイルがオープンされている場合, pipeは最初の利用可能なファイル記述子を書き込み用に,次の利用可能なファイル記述子を読み込み用に割り当てます。この例では,パイプは必ずしも隣接するファイル記述子を使用しません。たとえば,2 つのファイルがオープンされ,ファイル記述子 3 と 4 が割り当てられた後に,前者のファイルがクローズされたとします。この時点で pipeが呼び出されると,ファイル記述子 3 が書き込み用に,ファイル記述子 5 が読み込み用に割り当てられます。配列の要素 0 には 5 が,要素 1 には 3 が格納されます。

大量の I/O を行う大きなアプリケーションでは,パイプにどのファイル記述子が割り当てられるかを予測するのがさらに困難になります。しかし,子プロセスは,どのファイル記述子が使われるかを知っていないと,パイプの読み書きを正しく行うことができません。

正しいファイル記述子が使われるようにするには,次の手順を使用する方法があります。

  1. 親と子の両方が知っている 2 つの記述子番号を選択する。これらの番号は,パイプが作成される前に行われる I/O を考慮に入れて,十分に大きな値でなくてはならない。

  2. 親プロセスの中で, exec関数を呼び出す前のいずれかの時点で pipeを呼び出す。

  3. 親プロセスの中で, dup2を使用して, pipeから返されたファイル記述子を,上で選んだファイル記述子に割り当てる。これにより,これらのファイル記述子がパイプ用に予約される。それ以降の I/O は,パイプと干渉することはない。

UNIX I/O 関数の readwriteを使用し,適切なファイル記述子を指定することで,パイプを通しての読み書きを行うことができます。別の方法として, fdopen呼び出しを発行して,これらのファイル記述子にファイル・ポインタを関連付ければ,標準 I/O 関数 ( freadfwrite) を使用できるようになります。

パイプの読み込みと書き込みには 2 つの異なるファイル記述子が使用されますが,使用されるメールボックスは 1 つだけなので,何らかの I/O の同期化が必要となります。たとえば,親プロセスがパイプにメッセージを書き込んだとします。親プロセスがパイプから読み込みを行う最初のプロセスだった場合には, 図 REF-1 に示すように,自分のメッセージを読み戻すことになります。

注意

UNIX との互換性を高めるため,以下の機能論理名を使用して, C RTL のパイプ処理の動作を制御することができます。

  • DECC$STREAM_PIPE 機能論理名に ENABLE を定義すると, pipe関数がレコード入出力ではなくストリーム入出力を使用するようになります。

  • DECC$POPEN_NO_CRLF_REC_ATTR 機能論理名に ENABLE を定義すると, popen関数でオープンしたパイプのパイプ・レコードに,CR/LF のキャリッジ制御が追加されなくなります。この機能を有効にすると, getsのようなキャリッジ・リターン文字に依存している関数で,望ましくない動作になる可能性がある点に注意してください。

図 REF-1 パイプの読み込みと書き込み





戻り値

0 成功を示します。
-1    エラーを示します。




poll (Alpha, I64)

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



形式

#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 メンバのいずれかがストリームまたはマルチプレクサを参照していて,そのストリームまたはマルチプレクサが別のマルチプレクサの下流側に直接または間接的にリンクされています。




popen

プロセスに対するパイプを開始します。



形式

#include <stdio.h>

FILE *popen (const char *command, const char *type);




引数



command

シェル・コマンド・ラインを含んでいる,null で終わる文字列へのポインタ。

type

I/O モードを含んでいる,null で終わる文字列へのポインタ。オープン・ファイルは共用されるので, type rコマンドを入力フィルタとして, type wコマンドを出力フィルタとして使用することができます。 type 引数としては,以下のいずれかの値を使用します。

  • r---呼び出し元プログラムは,返されたファイル・ストリームから読み込みを行うことで,コマンドの標準出力から読み込みを行うことができる。

  • w---呼び出し元プログラムは,返されたファイル・ストリームに書き込みを行うことで,コマンドの標準入力に書き込みを行うことができる。




説明

popen関数は,呼び出し元プログラムと,実行を待っているシェル・コマンドの間にパイプを作成します。関数はストリームのための FILE構造体へのポインタを返します。

popen関数は, DECC$PIPE_BUFFER_SIZE 機能論理名の値を使用して,パイプ用に作成するメールボックスのバッファ・サイズを設定します。 DECC$PIPE_BUFFER_SIZE の値には,512 〜 65024 バイトを指定できます。 DECC$PIPE_BUFFER_SIZE が指定されていない場合,デフォルトのバッファ・サイズ 512 が使用されます。

注意

  • popen関数を使って出力フィルタを呼び出す場合には,出力データがプログラム・バッファに残るために生じるデッドロックの可能性に注意するようにしてください。これは, setvbuf関数を使って出力ストリームがバッファリングされないようにするか, fflush関数を使って, pclose関数を呼び出す前にすべてのバッファリングされたデータをフラッシュさせることによって避けることができます。

  • UNIX との互換性を高めるため,以下の機能論理名を使用して, C RTL のパイプ処理の動作を制御することができます。

    • DECC$STREAM_PIPE 機能論理名に ENABLE を定義すると, pipe関数がレコード入出力ではなくストリーム入出力を使用するようになります。

    • DECC$POPEN_NO_CRLF_REC_ATTR 機能論理名に ENABLE を定義すると, popen関数でオープンしたパイプのパイプ・レコードに,CR/LF のキャリッジ制御が追加されなくなります。この機能を有効にすると, getsのようなキャリッジ・リターン文字に依存している関数で,望ましくない動作になる可能性がある点に注意してください。

fflush, pclose, および setvbufも参照してください。




戻り値

x オープンされたストリームのための FILE 構造体へのポインタ。
NULL エラーを示します。ファイルまたはプロセスを作成することができませんでした。


前へ 次へ 目次 索引



         印刷用画面へ

プライバシー 本サイト利用時の合意事項