PIPE(2)

名称
pipe - プロセス間通信のための記述子のペアを作成する

ライブラリ
libc

書式
<unistd.h> int pipe(int *fildes)

解説
pipe() システムコールは 双方向のデータフローを可能とするオブジェクトである pipe を作成し、ペアのファイル記述子を割り当てます。

慣習により、通常は 1 番めの記述子がパイプの 読取り側 として使用され、2 番めの記述子が 書込み側 として使用されます。 ですので、 fildes[1] に書き込まれたデータが fildes[0] に現れます (すなわち、 fildes[0] から読み取れます)。 これを使えば 1 つのプログラムの出力を別のプログラムに送信できます。 送信側の標準出力をパイプの書込み側としてセットアップし、 受信側の標準入力をパイプの読取り側としてセットアップしてください。 パイプ自体は、すべての対応する記述子がクローズされるまで持続します。

一端が閉じているパイプは widowed (相手を失った) と見なされます。 このようなパイプに書込みをすると、書込みプロセスは SIGPIPE シグナルを受信します。 読取り側にファイルの終了を伝える方法は、 書込み側のパイプをクローズするしかありません。 読取り側がバッファに入っているデータを使い切った後、相手を失ったパイプを 読み取ると 0 カウントが返されます。

このパイプの実装における双方向という性質は、 古いシステムと互換性がありません。 ですので、パイプを一方向にしか使用しないときには、 従来の方法で端点を使用するこの慣習に従うことをお勧めします。

戻り値

エラー
pipe() システムコールは次の場合に失敗します。

[EMFILE]
    アクティブな記述子が多すぎます。

[ENFILE]
    システムファイルテーブルが満杯です。

[EFAULT]
    fildes バッファがプロセスのアドレス空間の不正な領域にあります。

関連項目
sh(1), fork(2), read(2), socketpair(2), write(2)

歴史
pipe() 関数は AT&T UNIX で登場しました。

双方向パイプははじめて AT&T UNIX で使用されました。