FIFOの特性

FIFOは、READとWRITEが任意の順序で発生できることを除いて、他のシーケンシャルファイルと同じ特性を持っています。

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を使って:

CLOSEを使って:

FIFOのデフォルトのアクセス許可は、FIFOを作成したプロセスのマスク設定と同じです。FIFOアクセス許可を指定するには、SYSTEM、GROUP、WORLD、およびUICのデバイスパラメータを使用します。ファイルのパーミッションは、すでにFIFOをオープンしているプロセスには影響しません。

FIFO実装における考慮事項

プロセス間通信のためのFIFOを確立するのと同様に、できるかどうか、そして、どのようにかを検討し、次の問題が扱われます:

  • READがすぐに発生するか、プロセスが待つことができるか?

  • システムがハングアップを回避しプロセスを削除する方法を提供するために有用に時間内にREADがあるか?

  • 書き込み処理は、READデータが受信されたかどうかを知る必要があるか?

  • 単一のFIFOにREADとWRITする複数のプロセスはありますか?

FIFOのエラー処理

エラーのあるOPENによって作成されたデバイス(またはファイル)を削除すると、そのデバイス特にFIFOが2つのプロセス間の通信手段として機能するときに、より深い意味があります。1つのプロセスがFIFOデバイスをWRITEのためにOPENすると、別のプロセスがREADのために同じデバイスをOPENできる間隔があります。その期間中、ライタ・プロセスはエラー(たとえば、無効なパラメータ)が発生してGT.Mにデバイスが削除されることがありますが、リーダー・プロセスはOPENを正常に完了できます。このシーケンスの結果、孤立したデバイスがREAD用にオープンされたプロセスが発生します。WRITE用に同じデバイスをOPENする他のプロセスは、その新しいインスタンスを作成します。そのため、リーダーは孤立したデバイスからREADするデータを見つけることができません。GT.Mにはリーダとライタ間のプロセス同期を強制するためのコンテキストが不十分なため、アプリケーションは適切な通信プロトコルとエラー処理技術を使用して通信用のファイルとFIFOを使用するプロセス間の同期を提供する必要があります。

GT.Mが認識するFIFO

シーケンシャル・ファイルと同様に、FIFOのパスはOPEN、USE、CLOSEコマンドの引数式として指定されます。FIFOデバイスパラメータでOPENされたデバイスは、その名前の別のデバイスがすでにOPENでない限り、FIFOになります。その場合に、FIFOとして別のプロセスによって以前にOPENされていたデバイスをOPENすることは、既存のFIFOに接続するためのプロセス(ここでのプロセスはFIFOを開こうとするプロセスです)を引き起こします。

[注意] 注意

FIFOデバイスパラメータを指定しなくても、既存の名前付きパイプ(別名 fifo 特殊ファイル)がOPENされている場合、FIFOが指定されたものとして扱われます。

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 デバイスパラメータの概要

次の表は、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

所有者のグループでは無いユーザのファイルのパーミッションを指定

inserted by FC2 system