Man page - pipe2(2)

Packages contains this manual

Available languages:

en fr pl nl ja ru de

Manual

PIPE

名 前
書 式
説 明
返 り 値
エ ラ ー
バ ー ジ ョ ン
準 拠
注 意

プ ロ グ ラ ム の ソ ー ス
関 連 項 目
こ の 文 書 に つ い て

名 前

pipe, pipe2 - パ イ プ を 生 成 す る

書 式

#include <unistd.h>

/* On Alpha, IA-64, MIPS, SuperH, and SPARC/SPARC64; see NOTES */
struct fd_pair {
long fd[2];
};
struct fd_pair pipe();

/* On all other architectures */
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 が 返 る 。 こ れ に よ り カ ー ネ ル が サ ポ ー ト し て い な い こ と が 分 か る 。

Since Linux 4.5, it is possible to change the O_DIRECT setting of a pipe file descriptor using fcntl (2).

O_NONBLOCK

Set the O_NONBLOCK file status flag on the open file descriptions referred to by the new file descriptors. Using this flag saves extra calls to fcntl (2) to achieve the same result.

返 り 値

On success, zero is returned. On error, -1 is returned, errno is set appropriately, and pipefd is left unchanged.

On Linux (and other systems), pipe () does not modify pipefd on failure. A requirement standardizing this behavior was added in POSIX.1-2008 TC2. The Linux-specific pipe2 () system call likewise does not modify pipefd on failure.

エ ラ ー

EFAULT

pipefd が 無 効 な 値 で あ る 。

EINVAL

( pipe2 ()) flags に 無 効 な 値 が 入 っ て い る 。

EMFILE

The per-process limit on the number of open file descriptors has been reached.

ENFILE

オ ー プ ン さ れ て い る フ ァ イ ル の 総 数 が シ ス テ ム 全 体 の 制 限 に 達 し て い る 。

ENFILE

The user hard limit on memory that can be allocated for pipes has been reached and the caller is not privileged; see pipe (7).

バ ー ジ ョ ン

pipe2 () は バ ー ジ ョ ン 2.6.27 で Linux に 追 加 さ れ た 。 glibc に よ る サ ポ ー ト は バ ー ジ ョ ン 2.9 以 降 で 利 用 で き る 。

準 拠

pipe (): POSIX.1-2001, POSIX.1-2008.

pipe2 () は Linux 固 有 で あ る 。

注 意

The System V ABI on some architectures allows the use of more than one register for returning multiple values; several architectures (namely, Alpha, IA-64, MIPS, SuperH, and SPARC/SPARC64) (ab)use this feature in order to implement the pipe () system call in a functional manner: the call doesn’t take any arguments and returns a pair of file descriptors as the return value on success. The glibc pipe () wrapper function transparently deals with this. See syscall (2) for information regarding registers used for storing second file descriptor.

以 下 の プ ロ グ ラ ム で は パ イ プ を 生 成 し 、 そ の 後 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), splice (2), tee (2), vmsplice (2), write (2), popen (3), pipe (7)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man-pages プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。