EN JA
PIPE(2)
PIPE(2) FreeBSD System Calls Manual PIPE(2)

名称

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

ライブラリ

Standard C Library (libc, -lc)

書式

#include < unistd.h>

int
pipe( int fildes[2]);

int
pipe2( int fildes[2], int flags);

解説

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

pipe2() システムコールは、 flags 引数によってファイル記述子の属性の制御を許可します。 flags の値は、 < fcntl.h> で定義される、次のリストのフラグのビット単位の論理和 (OR) によって構築されます:

O_CLOEXEC
新しいファイル記述子のための close-on-exec フラグを設定します。
O_NONBLOCK
パイプの終りのためのブロックされないフラグを設定します。

flags 引数が 0 であるなら、振る舞いは、 pipe() への呼び出しと同一です。

慣例によって、データを fildes[1] に書き込み、 fildes[0] に現れる (すなわち、読み込むことができる) ように、最初の記述子は、通常、パイプの 読み込みの終り として使用され、 2 番目は、通常、 書き込みの終り です。これによって、1 つのプログラムの出力を別のプログラムに送ることができます。発信元の標準出力は、パイプの書き込み終りとなるようにセットアップされ、受信側の標準入力は、パイプの読み込みの終りとなるようにセットアップされます。パイプそれ自体は、すべての関連する記述子がクローズされるまで、持続します。

クローズされた終りがあるパイプは、 相手がなくなった と見なされます。そのようなパイプに書き込むことによって、書き込みプロセスは、 SIGPIPE シグナルを受信します。相手がなくなったパイプは、読み込み側にエンドオブファイル (end-of-file) を配信するしかありません: 読み込み側があらゆるバッファリングされたデータを消費した後に、相手がなくなったパイプを読み込むことは、0 のカウントを返します。

この実装のパイプの双方向の性質は、古いシステムへの移植性がないので、 1 つの方向でパイプを使用するとき、古典的な手法で終了点を使用するための慣例を使用することが推奨されます。

戻り値

The pipe() function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

エラー

pipe() と pipe2() システムコールは、次の場合に失敗します:
[ EMFILE]
あまりにも多くの記述子がアクティブです。
[ ENFILE]
システムファイルテーブルが満杯です。
[ ENOMEM]
パイプを確立するための十分なカーネルメモリが足りません。

また pipe2() システムコールは、次の場合に失敗します:

[ EINVAL]
flags 引数が不正です。

歴史

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

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

pipe2() 関数は、 FreeBSD 10.0 で登場しました。

May 1, 2013 FreeBSD