kazmax - Linux で自宅サーバー

pipe - システムコールの説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. 返り値
  5. エラー
  6. 準拠
  7. 関連項目

名前

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); } }

関連項目