名 前
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 が 適 切 に 設 定 さ れ る 。 エ ラ ー
こ の プ ロ セ ス で 使 わ れ て い る フ ァ イ ル デ ィ ス ク リ プ タ ー が 多 す ぎ る 。
バ ー ジ ョ ン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>
int if (argc != 2)
{ if
(pipe(pipefd) == −1) { cpid = fork();
if (cpid == 0)
{ /* 子 プ ロ セ ス が
パ イ プ か ら 読
み 込 む */ while
(read(pipefd[0], &buf, 1) > 0) write(STDOUT_FILENO,
"\n", 1); 関 連 項 目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/ に 書 か れ て い る 。 |