pipe

Autres langues

Langue: ja

Version: 2004-06-17 (mandriva - 01/05/08)

Section: 2 (Appels système)

名前

pipe - パイプを生成する

書式

#include <unistd.h>

int pipe(int filedes[2]);

説明

pipe() はパイプの inode を指すファイル・ディスクリプター (descripter) の組を生成し、 そのファイル・ディスクリプターを filedes で示される配列に格納する。 filedes[0] には読み出し用、 filedes[1] には書き込み用のファイル・ディスクリプターが格納される。

返り値

成功した場合 0 が返る。失敗した場合 -1 が返り、 errno がエラーの内容に従って設定される。

エラー

EFAULT
filedes が無効な値である。
EMFILE
このプロセスで使われているファイル・ディスクリプターが多すぎる。
ENFILE
オープンされているファイルの総数がシステムの制限に達した。

準拠

POSIX.1-2001.

以下のプログラムではパイプを生成し、その後 fork(2) で子プロセスを生成する。 fork(2) の後、各プロセスはパイプ (pipe(7) を参照) に必要がなくなったディスクリプターをクローズする。 親プロセスはプログラムのコマンドライン引き数に含まれる 文字列をパイプへ書き込み、 子プロセスはこの文字列をパイプから 1 バイトずつ読み込んで標準出力にエコーする。
 
 #include <sys/wait.h>
 #include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
 
 int
 main(int argc, char *argv[])
 {
     int pfd[2];
     pid_t cpid;
     char buf;
 
     assert(argc == 2);
 
     if (pipe(pfd) == -1) { perror("pipe"); exit(EXIT_FAILURE); }
 
     cpid = fork();
     if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); }
 
     if (cpid == 0) {    /* 子プロセスがパイプから読み込む */
         close(pfd[1]);  /* 使用しない write 側はクローズする */
 
         while (read(pfd[0], &buf, 1) > 0)
             write(STDOUT_FILENO, &buf, 1);
 
         write(STDOUT_FILENO, "\n", 1);
         close(pfd[0]);
         _exit(EXIT_SUCCESS);
 
     } else {            /* 親プロセスは argv[1] をパイプへ書き込む */
         close(pfd[0]);  /* 使用しない read 側はクローズする */
         write(pfd[1], argv[1], strlen(argv[1]));
         close(pfd[1]);          /* 読み込み側が EOF に出会う */
         wait(NULL);             /* 子プロセスを待つ */
         exit(EXIT_SUCCESS);
     }
 }
 

関連項目

fork(2), read(2), socketpair(2), write(2), popen(3), pipe(7)