スポンサーリンク

PIPE(2) FreeBSD システムコールマニュアル PIPE(2)

名称

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

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#include <unistd.h>

int

pipe(int *fildes);

解説

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

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

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

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

戻り値

関数 pipe() は、処理が成功すると値 0 を返します。そうでない場合、値 -1 が 返され、グローバル変数 errno が設定されてエラーを示します。

エラー

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

       [EMFILE]

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

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

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

関連項目

sh(1), fork(2), read(2), socketpair(2), write(2)

歴史

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

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

FreeBSD 10.0 June 4, 1993 FreeBSD 10.0

スポンサーリンク