名 前
pipe, pipe2 − パ イ プ を 生 成 す る
書 式
#include <unistd.h>
int pipe(int pipefd[2]);
#define
_GNU_SOURCE /* feature_test_macros(7) 参 照
*/
#include <fcntl.h> /* O_* 定 数
の 定 義 の 取 得 */
#include <unistd.h>
int pipe2(int pipefd[2], int flags);
説 明
pipe() は パ イ プ を 生 成 す る 。 パ イ プ は 、 プ ロ セ ス 間 通 信 に 使 用 で き る 単 方 向 の デ ー タ チ ャ ネ ル で あ る 。 配 列 pipefd は 、 パ イ プ の 両 端 を 参 照 す る 二 つ の フ ァ イ ル デ ィ ス ク リ プ タ ー を 返 す の に 使 用 さ れ る 。 pipefd[0] が パ イ プ の 読 み 出 し 側 、 pipefd[1] が パ イ プ の 書 き 込 み 側 で あ る 。 パ イ プ の 書 き 込 み 側 に 書 き 込 ま れ た デ ー タ は 、 パ イ プ の 読 み 出 し 側 か ら 読 み 出 さ れ る ま で カ ー ネ ル で バ ッ フ ァ ー リ ン グ さ れ る 。 さ ら な る 詳 細 は pipe(7) を 参 照 の こ と 。
pipe2()
は flags が 0 の 場 合
に は pipe() と 同 じ
で あ る 。 flags に
以 下 の 値 を ビ
ッ ト 毎 の 論 理
和 (OR) で 指 定 す る
こ と で 、 異 な
る 動 作 を さ せ
る こ と が で き
る 。
O_CLOEXEC 新 し く 生 成
さ れ る 二 つ の
フ ァ イ ル デ ィ
ス ク リ プ タ ー
の close−on−exec (FD_CLOEXEC)
フ ラ グ を セ ッ
ト す る 。 こ の
フ ラ グ が 役 に
立 つ 理 由 に つ
い て は 、 open(2) の
O_CLOEXEC フ ラ グ の
説 明 を 参 照 の
こ と 。
O_DIRECT (Linux 3.4 以 降 ) 「
パ ケ ッ ト 」 モ
ー ド で 入 出 力
を 行 う パ イ プ
を 作 成 す る 。
こ の パ イ プ へ
の write(2) そ れ ぞ れ
が 別 の パ ケ ッ
ト と し て 扱 わ
れ 、 こ の パ イ
プ か ら の read(2) で
は 一 度 に 一 つ
パ ケ ッ ト が 読
み 出 さ れ る 。
以 下 の 点 に 注
意 す る こ と 。
*
PIPE_BUF バ イ ト (pipe(7) 参 照 ) よ り 大 き い デ ー タ を 書 き 込 ん だ 場 合 、 複 数 の パ ケ ッ ト に 分 割 さ れ る 。 定 数 PIPE_BUF は <limits.h> で 定 義 さ れ て い る 。
*
read(2) で 次 の パ ケ ッ ト よ り も 小 さ な バ ッ フ ァ ー サ イ ズ を 指 定 し た 場 合 、 要 求 さ れ た バ イ ト 数 の デ ー タ が 読 み 出 さ れ 、 そ の パ ケ ッ ト の 超 過 分 の バ イ ト は 破 棄 さ れ る 。 可 能 性 の あ る 最 大 サ イ ズ の パ ケ ッ ト を 読 み 出 す に は 、 PIPE_BUF の バ ッ フ ァ ー サ イ ズ を 指 定 す れ ば 十 分 で あ る (上 の 項 目 を 参 照 )。
*
長 さ 0 の パ ケ ッ ト は サ ポ ー ト さ れ て い な い 。 (バ ッ フ ァ ー サ イ ズ 0 を 指 定 し た read(2) は 何 も 行 わ ず 0 を 返 す )。 こ の フ ラ グ を サ ポ ー ト し て い な い 古 い カ ー ネ ル で は 、 エ ラ ー EINVAL が 返 る 。 こ れ に よ り カ ー ネ ル が サ ポ ー ト し て い な い こ と が 分 か る 。
O_NONBLOCK 新 し く 生 成 さ れ る 二 つ の オ ー プ ン フ ァ イ ル 記 述 (open file description) の O_NONBLOCK フ ァ イ ル ス テ ー タ ス フ ラ グ を セ ッ ト す る 。 こ の フ ラ グ を 使 う こ と で 、 O_NONBLOCK を セ ッ ト す る た め に fcntl(2) を 追 加 で 呼 び 出 す 必 要 が な く な る 。
返 り 値
成 功 し た 場 合 は 0 が 返 さ れ る 。 エ ラ ー の 場 合 は −1 が 返 さ れ 、 errno が 適 切 に 設 定 さ れ る 。
エ ラ ー
EFAULT
pipefd が 無 効 な 値 で あ る 。
EINVAL
(pipe2()) flags に 無 効 な 値 が 入 っ て い る 。
EMFILE
こ の プ ロ セ ス で 使 わ れ て い る フ ァ イ ル デ ィ ス ク リ プ タ ー が 多 す ぎ る 。
ENFILE オ ー プ ン さ れ て い る フ ァ イ ル の 総 数 が シ ス テ ム の 制 限 に 達 し て い る 。
バ ー ジ ョ ン
pipe2() は バ ー ジ ョ ン 2.6.27 で Linux に 追 加 さ れ た 。 glibc に よ る サ ポ ー ト は バ ー ジ ョ ン 2.9 以 降 で 利 用 で き る 。
準 拠
pipe(): POSIX.1−2001.
pipe2() は Linux 固 有 で あ る 。
例
以 下 の プ ロ グ ラ ム で は パ イ プ を 生 成 し 、 そ の 後 fork(2) で 子 プ ロ セ ス を 生 成 す る 。 子 プ ロ セ ス は 同 じ パ イ プ を 参 照 す る フ ァ イ ル デ ィ ス ク リ プ タ ー 集 合 の コ ピ ー を 継 承 す る 。 fork(2) の 後 、 各 プ ロ セ ス は パ イ プ (pipe(7) を 参 照 ) に 必 要 が な く な っ た デ ィ ス ク リ プ タ ー を ク ロ ー ズ す る 。 親 プ ロ セ ス は プ ロ グ ラ ム の コ マ ン ド ラ イ ン 引 き 数 に 含 ま れ る 文 字 列 を パ イ プ へ 書 き 込 み 、 子 プ ロ セ ス は こ の 文 字 列 を パ イ プ か ら 1 バ イ ト ず つ 読 み 込 ん で 標 準 出 力 に エ コ ー す る 。 プ ロ グ ラ ム の ソ ー ス
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int
main(int argc, char *argv[])
{
int pipefd[2];
pid_t cpid;
char buf;
if (argc != 2)
{
fprintf(stderr, "Usage: %s <string>\n",
argv[0]);
exit(EXIT_FAILURE); }
if
(pipe(pipefd) == −1) {
perror("pipe");
exit(EXIT_FAILURE); }
cpid = fork();
if (cpid == −1) {
perror("fork");
exit(EXIT_FAILURE); }
if (cpid == 0)
{ /* 子 プ ロ セ ス が
パ イ プ か ら 読
み 込 む */
close(pipefd[1]); /* 使 用 し な
い write 側 は ク ロ ー
ズ す る */
while
(read(pipefd[0], &buf, 1) > 0)
write(STDOUT_FILENO, &buf, 1);
write(STDOUT_FILENO,
"\n", 1);
close(pipefd[0]);
_exit(EXIT_SUCCESS); }
else { /* 親 プ ロ セ ス
は argv[1] を パ イ プ
へ 書 き 込 む */
close(pipefd[0]); /* 使 用 し な
い read 側 は ク ロ ー
ズ す る */
write(pipefd[1], argv[1], strlen(argv[1]));
close(pipefd[1]); /* 読 み 込 み
側 が EOF に 出 会 う */
wait(NULL); /* 子 プ ロ セ ス
を 待 つ */
exit(EXIT_SUCCESS); } }
関 連 項 目
fork(2), read(2), socketpair(2), write(2), popen(3), pipe(7)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。