PIPE

Section: Linux Programmer's Manual (7)
Updated: 2014-07-08
Index JM Home Page
 

名前

pipe - パイプと FIFO の概要  

説明

パイプと 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 バイトである。 Linux 2.6.35 以降では、パイプの容量のデフォルト値は 65536 バイトだが、 パイプの容量を参照、設定を fcntl(2) の F_GETPIPE_SZF_SETPIPE_SZ 操作を使って行うことができる。 詳細は fcntl(2) 参照。

 

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) は失敗し、 errnoEAGAIN がセットされる。
O_NONBLOCK 無効, n > PIPE_BUF
書き込みは atomic とはならない。 write(2) に渡されたデータの間に、他のプロセスにより write(2) されたデータが入ることがある。 write(2) は n バイトの書き込みが完了するまで停止する。
O_NONBLOCK 有効, n > PIPE_BUF
パイプがフルの場合、 write(2) は失敗し、 errnoEAGAIN がセットされる。 それ以外の場合、1 バイト以上 n バイト以下のデータが書き込まれる (つまり「一部分だけ書き込まれる」場合もあり得る)。 呼び出し元は write(2) の返り値を参照し、実際に何バイト書き込まれたのかを確認すべきである。 また、書き込みに成功したデータも、他のプロセスが書き込んだデータが 間に入ることがある。
 

オープンファイル状態フラグ

オープンファイル状態フラグのうち、パイプや FIFO に対して意味を持つのは O_NONBLOCKO_ASYNC だけである。

パイプの読み出し側に O_ASYNC フラグをセットすると、パイプに新たな入力があるとシグナル (デフォルトでは SIGIO) が生成される (詳細は fcntl(2) を参照)。 Linux では、 パイプと FIFO に対する O_ASYNC はカーネル 2.6 以降でのみサポートされている。  

移植に関する注意

いくつかのシステム (Linux ではない) では、パイプは双方向である、 つまりパイプの両端間でデータを両方向に送信することができる。 POSIX.1-2001 では、パイプは一方向の通信だけに対応していればよい。 移植を考慮したアプリケーションでは、双方向パイプの仕組みを 前提にすべきではない。  

関連項目

dup(2), fcntl(2), open(2), pipe(2), poll(2), select(2), socketpair(2), stat(2), mkfifo(3), epoll(7), fifo(7)  

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。

関連キーワード

パイプ, PIPE, バイト, 書き込み, データ, 読み出し, プロセス, BUF, 参照, オープン

Linux マニュアル 一覧

[man1] [man2] [man3] [man4] [man5] [man6] [man7] [man8]
[a] [b] [c] [d] [e] [f] [g] [h] [i] [j] [k] [l] [m] [n] [o] [p] [q] [r] [s] [t] [u] [v] [w] [x] [y] [z]

 

Index

名前
説明
パイプや FIFO に対する入出力
パイプの容量
PIPE_BUF
オープンファイル状態フラグ
移植に関する注意
関連項目
この文書について

This document was created by man2html, using the manual pages.
Time: 12:08:34 GMT, June 11, 2022