PIPE
Section: Linux Programmer's Manual (2)
Updated: 2004-06-17
Index
JM Home Page
roff page
名前
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)
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- エラー
-
- 準拠
-
- 例
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 04:31:55 GMT, November 19, 2007