FIFOは、READとWRITEが任意の順序で発生できることを除いて、他のシーケンシャルファイルと同じ特性を持っています。
FIFOの動作の次の特性は、それらを効果的に使用するのに役立ちます。
READを使って:
FIFOにデータが存在しない間、もしREADが行われている場合:
タイムアウトが指定されている時には、データが別のプロセスによってFIFOに入れられている、または、READタイムアウトになるまで、プロセスはハングアップします。
次の表は、FIFOデバイス上のさまざまなタイプのREAD操作のI / Oステータス変数の結果と値を示しています。
オペレーション |
結果(Result) |
$DEVICE |
$ZA |
$TEST |
X |
$ZEOF |
---|---|---|---|---|---|---|
READ X:n |
正常終了 |
0 |
0 |
1 |
データ読み取り |
0 |
READ X:n |
データ読み取りなしでタイムアウト |
0 |
0 |
0 |
空の文字列 |
0 |
READ X:n |
部分的なデータ読み取りでタイムアウト |
0 |
0 |
0 |
部分的なデータ |
0 |
READ X:n |
ファイルの最後(End of File) |
1,Device detected EOF |
9 |
1 |
空の文字列 |
1 |
READ X:0 |
正常終了 |
0 |
0 |
1 |
データ読み取り |
0 |
READ X:0 |
利用可能なデータがない |
0 |
0 |
0 |
空の文字列 |
0 |
READ X:0 |
部分的なデータ読み取りでタイムアウト |
0 |
0 |
0 |
部分的なデータ |
0 |
READ X:0 |
ファイルの最後(End of File) |
1,Device detected EOF |
9 |
1 |
空の文字列 |
1 |
READ X |
エラー |
1,<error signature> |
9 |
n/c |
空の文字列 |
0 |
WRITEを使って:
FIFOデバイスはノンブロッキング書き込みを行います。プロセスが完全なFIFOに書き込もうとしたときにWRITEがブロックされると、デバイスは暗黙的に操作をデフォルトの10回まで完了しようとします。gtm_non_blocked_write_retries 環境変数が定義されている場合、これはデフォルトの再試行回数を無効にします。再試行が成功しない(ブロックされたままで)場合、WRITE は $DEVICE を "1、Resource temporarily unavailable"、$ZAを9に設定し、エラーを生成します。GT.MプロセスがEXCEPTION、$ETRAPまたは$ZTRAPを定義している場合、エラートラップは、FIFOデバイスからデータを削除する可能性のあるアクションまたは遅延の後にWRITEを再試行することを選択できます。
それがハングしている間は、プロセスは<CTRL-C>に応答しません。
CLOSEを使って:
DELETE修飾子が指定されていない限り、FIFOは削除されません。
もしプロセスがDELETE修飾子でFIFOを閉じた場合、FIFOはその時点で新規ユーザに対しては利用できなくなります。
それに接続されている最後のプロセスがそれをクローズし破棄されるまで、現在のFIFOをUSEしているすべてのプロセスは、それを使用し続けることができます。
削除されたFIFOと同じ名前を持つFIFOをOPENしているすべてのプロセスは、その後のOPENをアタッチする新しい1つのものを作成します。
FIFOのデフォルトのアクセス許可は、FIFOを作成したプロセスのマスク設定と同じです。FIFOアクセス許可を指定するには、SYSTEM、GROUP、WORLD、およびUICのデバイスパラメータを使用します。ファイルのパーミッションは、すでにFIFOをオープンしているプロセスには影響しません。
プロセス間通信のためのFIFOを確立するのと同様に、できるかどうか、そして、どのようにかを検討し、次の問題が扱われます:
READがすぐに発生するか、プロセスが待つことができるか?
システムがハングアップを回避しプロセスを削除する方法を提供するために有用に時間内にREADがあるか?
書き込み処理は、READデータが受信されたかどうかを知る必要があるか?
単一のFIFOにREADとWRITする複数のプロセスはありますか?
エラーのあるOPENによって作成されたデバイス(またはファイル)を削除すると、そのデバイス特にFIFOが2つのプロセス間の通信手段として機能するときに、より深い意味があります。1つのプロセスがFIFOデバイスをWRITEのためにOPENすると、別のプロセスがREADのために同じデバイスをOPENできる間隔があります。その期間中、ライタ・プロセスはエラー(たとえば、無効なパラメータ)が発生してGT.Mにデバイスが削除されることがありますが、リーダー・プロセスはOPENを正常に完了できます。このシーケンスの結果、孤立したデバイスがREAD用にオープンされたプロセスが発生します。WRITE用に同じデバイスをOPENする他のプロセスは、その新しいインスタンスを作成します。そのため、リーダーは孤立したデバイスからREADするデータを見つけることができません。GT.Mにはリーダとライタ間のプロセス同期を強制するためのコンテキストが不十分なため、アプリケーションは適切な通信プロトコルとエラー処理技術を使用して通信用のファイルとFIFOを使用するプロセス間の同期を提供する必要があります。
シーケンシャル・ファイルと同様に、FIFOのパスはOPEN、USE、CLOSEコマンドの引数式として指定されます。FIFOデバイスパラメータでOPENされたデバイスは、その名前の別のデバイスがすでにOPENでない限り、FIFOになります。その場合に、FIFOとして別のプロセスによって以前にOPENされていたデバイスをOPENすることは、既存のFIFOに接続するためのプロセス(ここでのプロセスはFIFOを開こうとするプロセスです)を引き起こします。
注意 | |
---|---|
FIFOデバイスパラメータを指定しなくても、既存の名前付きパイプ(別名 fifo 特殊ファイル)がOPENされている場合、FIFOが指定されたものとして扱われます。 |
次の二つの例は、マスターが次に処理をするいくつかのデータをFIFOに送信するまで、スレーブはFIFOで読み取り状態で待機している、マスター/スレーブの組み合わせを表しています。
例:
set x="named.pipe" open x:fifo do getres use x write res,!
このルーチンはFIFOを開き、(このコードフラグメントに示されていない)、スレーブプロセスの起動が含まれているその独自の処理を実行します。
例:
set x="named.pipe" open x:fifo use x read res do process(res)
このルーチンは、マスタプロセスからの情報を待って、その後の処理を開始します。
次の表は、FIFOで使用できるデバイスパラメータをまとめたものです。
ファイルフォーマットのデバイスパラメータ | ||
---|---|---|
デバイスパラメータ |
CMD |
説明 |
[NO]FIXED |
O |
レコードが固定長であるかどうかを制御 |
[Z]LENGTH=intexpr |
U |
仮想ページの長さを制御 |
RECORDSIZE=intexpr |
O |
レコードサイズの最大を指定 |
VARIABLE |
O |
レコードが可変長であるかどうかを制御 |
[Z]WIDTH=intexpr |
U |
デバイスの論理レコードのサイズを設定し、WRAPを有効にします。 |
[Z][NO]WRAP |
O/U |
最大幅より長い出力行のハンドリングを制御 |
ファイルアクセスのデバイスパラメータ | ||
---|---|---|
デバイスパラメータ |
CMD |
コメント |
DELETE |
C |
最後のユーザーがそれを閉じると、FIFOが削除されるように指定します。もしOPENで指定された場合、DELETEはclose時にのみアクティブ化されます。新規のアタッチメントは削除されたFIFOを許可しません、そして、削除されたデバイスの名前でFIFOを使用するための新しい試みは新しいデバイスを作成します。、、 |
GROUP=expr |
O/C |
所有者のグループ内の他のユーザのファイルのパーミッションを指定 |
[NO]READONLY |
O |
読み込み専用 (READONLY) または読み書き可能 (NOREADONLY) でデバイスをOPENします。 |
OWNER=expr |
O/C |
ファイルのオーナーのためにファイルのパーミッションを指定 |
RENAME=expr |
C |
CLOSEが式で指定された名前でディスクファイルの名前を置き換えることを指定します。 |
SYSTEM=expr |
O/C |
ファイルのオーナーのためにファイルのパーミッションを指定 |
UIC=expr |
O/C |
ファイルオーナーのIDを指定 |
WORLD=expr |
O/C |
所有者のグループでは無いユーザのファイルのパーミッションを指定 |