Manpages

名 前

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/ に 書 か れ て い る 。

COMMENTS