構文
int pipe(int fildes[2]);
説明
pipe() は、パイプと呼ばれる 入出力機構を生成し、2 つのファイル記述子 fildes[0] と fildes[1] を返します。 fildes[0] は読取り用にオープンされ、 fildes[1] は書込み用にオープンされるものです。
fildes[1] に書き込まれたデータは、 読取り専用ファイル記述子 fildes[0] によって 先入れ先出し (FIFO) 式にアクセスされます。
パイプの 入出力動作の詳細については、 read(2) と write(2) の項を参照してください。
デフォルトでは、HP-UX パイプは、ストリームベースではありません。システム上に作成されたすべてのパイプがストリームベースになるように、カーネルを生成することは可能です。HP-UX
リリース 10.0 以降でのみ、これを行うことができます。( mknod または mkfifo によって作成される) ストリームベースの FIFO は、HP-UX ではサポートされていません。
ストリームベースのパイプをサポートするカーネルを生成するには、次のように行います。
STREAMS/UX をインストールしなければなりません。
モジュール pipemod およびドライバ pipedev が、 /stand/system ファイル中に含まれていなければなりません (STREAMS/UX がインストールされたとき、 pipemod および pipedev はシステムファイルに自動的に追加されます
)。
調整可能なパラメータ"streampipes"が、 /stand/system ファイル中で 1 にセットされていなければなりません (これは、STREAMS/UX がインストールされたときに自動的に行われません)。
カーネルを生成し、システムを再ブートしなければなりません。
いったん、再ブートすると、 pipe() によって作成されたすべてのパイプは、ストリームベースになります。
詳細については、 HP 9000 リファレンスマニュアルの STREAMS/UX を参照してください。
例
pipe() を用いてコマンド行 ls |
sort を実現する例を示します。
#include <sys/types.h>
pid_t pid;
int pipefd[2];
/* Assumes file descriptor 0 and 1 are open */
pipe (pipefd);
if ((pid = fork()) == (pid_t)0) /* check process id of child process */ {
close(1); /* close stdout */
dup (pipefd[1]); /* points pipefd at file descriptor */
close (pipefd[0]);
execlp ( ls", ls , (char *)0); /* child process does ls */"
}
else if (pid > (pid_t)0) {
close(0); /* close stdin */
dup (pipefd[0]);
/* point the child's standard output to parent's standard input */
close (pipefd[1]);
execlp ("sort", "sort", (char *)0); /* parent process does sort */
}
戻り値
正常終了すると 0 を返します。 異常終了すると
-1 を返し、 エラーを示す値が errno にセットされます。
エラー
pipe() は、次の条件のいずれかを満たす場合に異常終了します。
| [EMFILE] | | NFILE -1 個またはそれ以上のファイル記述子がオープンされている場合 |
| [ENFILE] | | システム ファイルテーブルがいっぱいである場合 |
| [ENOSPC] | | ファイルシステムに十分な空間がなく、 パイプが生成できない場合 |
| [ENOSR] | | 両ストリームヘッドのリソースを割り当てることができなかった場合 (ストリームベースのパイプのみ) |
参照
sh(1), read(2), write(2), popen(3S), streamio(7)
標準準拠
pipe(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1