fifo - FIFO
特殊ファイル、名前付きパイプ
FIFO 特殊ファイル
(名前付きパイプ)
はパイプに似ているが、
FIFO
はファイルシステムの一部に関連付けられている点が異なる。複数のプロセスが読み込みや書き込みのために
FIFO
をオープンすることができる。プロセスが
FIFO
を通してデータを交換する場合、カーネルは、データを実際にはファイルシステムに書き込まず、すべてのデータを内部的に渡す。このように、
FIFO
特殊ファイルはファイルシステム上には内容を持たない。ファイルシステムのエントリーは、プロセスがファイルシステム上の名前を使用してそのパイプにアクセスできるように参照ポイントを提供しているだけである。
カーネルは、少なくとも一つのプロセスによってオープンされている
FIFO
特殊ファイルに関して、
1 つの FIFO
特殊ファイルにつき 1
つのパイプオブジェクトを管理する。データを渡す前に、
FIFO の両端
(書き込み側と読み出し側)
がオープンされていなければならない。通常、
FIFO
をオープンしようとした場合、その反対側がオープンされるまで停止
(block) される。
プロセスは FIFO を非停止
(nonblocking)
モードでオープンすることもできる。この場合、読み込み専用でオープンしようとした場合には、書き込み側を誰もオープンしていなくても成功する。書き込み専用でオープンしようとした場合には、反対側がすでにオープンされていない限り、
ENXIO
(そのようなデバイスまたはアドレスは存在しない)
というエラーで失敗する。
Linux では、 FIFO
を読み書き両用でオープンした場合、
停止、非停止のどちらのモードでも成功する。
POSIX
では、この場合の動作は定義されていない。この動作は、読み込み側がいない時に書き込み用に
FIFO
をオープンするために使用できる。自分自身と通信するために
FIFO
の両端を使用するプロセスでは、デッドロックを避けるために細心の注意を払う必要がある。
FIFO
における入出力の動作の詳細については、
pipe(7) を参照のこと。
プロセスが、反対の読み込み側がオープンされていない
FIFO
に書き込もうとした場合、そのプロセスに
SIGPIPE
シグナルが送られる。
FIFO 特殊ファイルは
mkfifo(3)
で作成することができ、
ls -l
ではファイル種別 'p'
で表示される。
mkfifo(1),
open(2),
pipe(2),
sigaction(2),
signal(2),
socketpair(2),
mkfifo(3),
pipe(7)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。