説明
パイプと FIFO (名前付きパイプともいう) は、単方向のプロセス間通信チャネルを提供する。パイプには「読み出し側」と「書き込み側」がある。パイプの書き込み側で書き込まれたデータは、パイプの読み出し側から読み出すことができる。
パイプを作成するには
pipe(2) を使用する。
pipe(2) は新しいパイプを作成し、ファイル・ディスクリプタを二つ返す。ディスクリプタのうち、一方はパイプの読み出し側を、もう一方は書き込み側を参照している。パイプは関連するプロセス間の通信を作成するのに使用できる。例は
pipe(2) を参照。
FIFO (First In First Out の省略) はファイルシステムでの名前を持ち、
open(2) を使ってオープンできる (
mkfifo(3) を使って作成される)。どんなプロセスでも、ファイルのアクセス許可があれば FIFO をオープンすることができる。読み出し側をオープンするには
O_RDONLY フラグを使用し、書き込み側をオープンするには
O_WRONLY フラグを使用する。詳細は
fifo(7) を参照。【注意】 FIFO はファイルシステム内のパス名を持つが、 FIFO に対して入出力を行っても、(ファイルシステムが存在するデバイスがあったとしても) そのデバイスに対する操作は発生しない。
パイプや FIFO に対する入出力
パイプと FIFO の違いは作成やオープンの方法だけである。これらの操作が完了した後は、パイプと FIFO に対する入出力は全く同じ仕組みで行われる。
プロセスが空のパイプから読み出しを行おうとした場合、
read(2) はデータが読み出し可能になるまで停止する。プロセスがフル状態のパイプに書き込みを行おうとした場合、
write(2) は書き込みを完了するのに十分な量のパイプからの読み出しが行われるまで停止する。非停止 (nonblocking) I/O を使うこともできる。非停止 I/O を使うには、
fcntl(2)
F_SETFL 操作を使って、
O_NONBLOCK オープンファイル状態フラグを有効にする。
パイプにより提供される通信チャネルは「バイトストリーム」であり、メッセージ境界の概念はない。
パイプの書き込み側を参照しているファイル・ディスクリプタがすべてクローズされた後で、そのパイプから
read(2) を行おうとした場合、 end-of-file (ファイル末尾) が見える (
read(2) は 0 を返す)。パイプの読み出し側を参照しているファイル・ディスクリプタがすべてクローズされた後で、
write(2) を行うと、呼び出し元プロセスに
SIGPIPE シグナルが送られる。呼び出し元プロセスがこのシグナルを無視しているときには、
write(2) はエラー
EPIPE で失敗する。
pipe(2) と
fork(2) を使用するアプリケーションでは、
close(2) を適切に使って不必要なファイル・ディスクリプタの複製をクローズすべきである。こうすることで、必要な時に確実に end-of-file や
SIGPIPE/
EPIPE が配送されるようになる。
パイプには
lseek(2) を行うことはできない。
パイプの容量
パイプの容量には上限がある。パイプがフルの場合、
write(2) は停止したり失敗したりする。どちらになるかは
O_NONBLOCK フラグがセットされているかどうかに依存する (下記参照)。実装により、パイプの容量の上限は異なる。アプリケーションは特定の容量を前提にすべきではない。書き込み側のプロセスが停止したままにならないよう、読み出し側のプロセスはデータが利用可能になったらできるだけすぐに読み出しを行うように、アプリケーションを設計すべきである。
バージョン 2.6.11 より前の Linux ではパイプの容量はシステムのページサイズと同じであった (例えば i386 では 4096 バイト)。 Linux 2.6.11 以降では、パイプの容量は 65536 バイトである。
PIPE_BUF
POSIX.1-2001 では、
PIPE_BUF バイト以下の
write(2) は atomic に行われること、つまりパイプへの出力データの書き込みは連続したシーケンスとして行われることを必須としている (MUST)。
PIPE_BUF バイトより多くのデータを書き込み場合は atomic とはならない、つまりパイプへの他のプロセスによるデータの書き込みが間に入る可能性がある。 POSIX.1-2001 の仕様では、
PIPE_BUF は最小でも 512 バイトであることが要求されている (Linux では
PIPE_BUF は 4096 バイトである)。正確な動作は、ファイル・ディスクリプタが nonblocking (
O_NONBLOCK) かどうか、パイプへの書き込みが複数から行われるかどうか、および書き込みを行うバイト数
n により決定される。
-
O_NONBLOCK 無効,
n <=
PIPE_BUF
-
n バイト全部の書き込みが atomic に行われる。
n バイト分をすぐに書き込む余地がない場合は
write(2) は停止 (block) することがある。
-
O_NONBLOCK 有効,
n <=
PIPE_BUF
-
パイプに
n バイトを書き込む余地がある場合は、
n バイト全部がすぐに書き込まれる。余地がない場合は、
write(2) は失敗し、
errno に
EAGAIN がセットされる。
-
O_NONBLOCK 無効,
n >
PIPE_BUF
-
書き込みは atomic とはならない。
write(2) に渡されたデータの間に、他のプロセスにより
write(2) されたデータが入ることがある。
write(2) は
n バイトの書き込みが完了するまで停止する。
-
O_NONBLOCK 有効,
n >
PIPE_BUF
-
パイプがフルの場合、
write(2) は失敗し、
errno に
EAGAIN がセットされる。それ以外の場合、1 バイト以上
n バイト以下のデータが書き込まれる (つまり「一部分だけ書き込まれる」場合もあり得る)。呼び出し元は
write(2) の返り値を参照し、実際に何バイト書き込まれたのかを確認すべきである。また、書き込みに成功したデータも、他のプロセスが書き込んだデータが間に入ることがある。
オープンファイル状態フラグ
オープンファイル状態フラグのうち、パイプや FIFO に対して意味を持つのは
O_NONBLOCK と
O_ASYNC だけである。
パイプの読み出し側に
O_ASYNC フラグをセットすると、パイプに新たな入力があるとシグナル (デフォルトでは
SIGIO) が生成される (詳細は
fcntl(2) を参照)。 Linux では、パイプと FIFO に対する
O_ASYNC はカーネル 2.6 以降でのみサポートされている。
移植に関する注意
いくつかのシステム (Linux ではない) では、パイプは双方向である、つまりパイプの両端間でデータを両方向に送信することができる。 POSIX.1-2001 では、パイプは一方向の通信だけに対応していればよい。移植を考慮したアプリケーションでは、双方向パイプの仕組みを前提にすべきではない。