other versions
other sections
PIPE(7) | Linux Programmer's Manual | PIPE(7) |
名前¶
pipe - パイプと FIFO の概要説明¶
パイプと FIFO (名前付きパイプともいう) は、 単方向のプロセス間通信チャネルを提供する。 パイプには「読み出し側」と「書き込み側」がある。 パイプの書き込み側で書き込まれたデータは、 パイプの読み出し側から読み出すことができる。パイプや FIFO に対する入出力¶
パイプと FIFO の違いは作成やオープンの方法だけである。 これらの操作が完了した後は、パイプと FIFO に対する入出力は 全く同じ仕組みで行われる。パイプの容量¶
パイプの容量には上限がある。 パイプがフルの場合、 write(2) は停止したり失敗したりする。どちらになるかは O_NONBLOCK フラグがセットされているかどうかに依存する (下記参照)。 実装により、パイプの容量の上限は異なる。 アプリケーションは特定の容量を前提にすべきではない。 書き込み側のプロセスが停止したままにならないよう、 読み出し側のプロセスはデータが利用可能になったらできるだけすぐに 読み出しを行うように、アプリケーションを設計すべきである。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 だけである。移植に関する注意¶
いくつかのシステム (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.41 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2005-12-08 | Linux |