Manpages

名 前

pipe − パ イ プ と FIFO の 概 要

説 明

パ イ プ と FIFO (名 前 付 き パ イ プ と も い う ) は 、 単 方 向 の プ ロ セ ス 間 通 信 チ ャ ネ ル を 提 供 す る 。 パ イ プ に は 「 読 み 出 し 側 」 と 「 書 き 込 み 側 」 が あ る 。 パ イ プ の 書 き 込 み 側 で 書 き 込 ま れ た デ ー タ は 、 パ イ プ の 読 み 出 し 側 か ら 読 み 出 す こ と が で き る 。 パ イ プ を 作 成 す る に は pipe(2) を 使 用 す る 。 pipe(2) は 新 し い パ イ プ を 作 成 し 、 フ ァ イ ル デ ィ ス ク リ プ タ ー を 二 つ 返 す 。 デ ィ ス ク リ プ タ ー の う ち 、 一 方 は パ イ プ の 読 み 出 し 側 を 、 も う 一 方 は 書 き 込 み 側 を 参 照 し て い る 。 パ イ プ は 関 連 す る プ ロ セ ス 間 の 通 信 を 作 成 す る の に 使 用 で き る 。 例 は pipe(2) を 参 照 。

FIFO (First In First Out の 省 略 ) は フ ァ イ ル シ ス テ ム で の 名 前 を 持 ち 、 open(2) を 使 っ て オ ー プ ン で き る (mkfifo(3) を 使 っ て 作 成 さ れ る )。 ど ん な プ ロ セ ス で も 、 フ ァ イ ル の ア ク セ ス 許 可 が あ れ ば FIFO を オ ー プ ン す る こ と が で き る 。 読 み 出 し 側 を オ ー プ ン す る に は O_RDONLY フ ラ グ を 使 用 し 、 書 き 込 み 側 を オ ー プ ン す る に は O_WRONLY フ ラ グ を 使 用 す る 。 詳 細 は fifo(7) を 参 照 。 【 注 意 】 FIFO は フ ァ イ ル シ ス テ ム 内 の パ ス 名 を 持 つ が 、 FIFO に 対 し て 入 出 力 を 行 っ て も 、 (フ ァ イ ル シ ス テ ム が 存 在 す る デ バ イ ス が あ っ た と し て も ) そ の デ バ イ ス に 対 す る 操 作 は 発 生 し な い 。 パ イ プ や FIFO に 対 す る 入 出 力 パ イ プ と FIFO の 違 い は 作 成 や オ ー プ ン の 方 法 だ け で あ る 。 こ れ ら の 操 作 が 完 了 し た 後 は 、 パ イ プ と FIFO に 対 す る 入 出 力 は 全 く 同 じ 仕 組 み で 行 わ れ る 。 プ ロ セ ス が 空 の パ イ プ か ら 読 み 出 し を 行 お う と し た 場 合 、 read(2) は デ ー タ が 読 み 出 し 可 能 に な る ま で 停 止 す る 。 プ ロ セ ス が フ ル 状 態 の パ イ プ に 書 き 込 み を 行 お う と し た 場 合 、 write(2) は 書 き 込 み を 完 了 す る の に 十 分 な 量 の パ イ プ か ら の 読 み 出 し が 行 わ れ る ま で 停 止 す る 。 非 停 止 (nonblocking) I/O を 使 う こ と も で き る 。 非 停 止 I/O を 使 う に は 、 fcntl(2) F_SETFL 操 作 を 使 っ て 、 O_NONBLOCK オ ー プ ン フ ァ イ ル 状 態 フ ラ グ を 有 効 に す る 。 パ イ プ に よ り 提 供 さ れ る 通 信 チ ャ ネ ル は 「 バ イ ト ス ト リ ー ム 」 で あ り 、 メ ッ セ ー ジ 境 界 の 概 念 は な い 。 パ イ プ の 書 き 込 み 側 を 参 照 し て い る フ ァ イ ル デ ィ ス ク リ プ タ ー が す べ て ク ロ ー ズ さ れ た 後 で 、 そ の パ イ プ か ら read(2) を 行 お う と し た 場 合 、 end−of−file (フ ァ イ ル 末 尾 ) が 見 え る (read(2) は 0 を 返 す )。 パ イ プ の 読 み 出 し 側 を 参 照 し て い る フ ァ イ ル デ ィ ス ク リ プ タ ー が す べ て ク ロ ー ズ さ れ た 後 で 、 write(2) を 行 う と 、 呼 び 出 し 元 プ ロ セ ス に SIGPIPE シ グ ナ ル が 送 ら れ る 。 呼 び 出 し 元 プ ロ セ ス が こ の シ グ ナ ル を 無 視 し て い る と き に は 、 write(2) は エ ラ ー EPIPE で 失 敗 す る 。 pipe(2)fork(2) を 使 用 す る ア プ リ ケ ー シ ョ ン で は 、 close(2) を 適 切 に 使 っ て 不 必 要 な フ ァ イ ル デ ィ ス ク リ プ タ ー の 複 製 を ク ロ ー ズ す べ き で あ る 。 こ う す る こ と で 、 必 要 な 時 に 確 実 に end−of−file や SIGPIPE/EPIPE が 配 送 さ れ る よ う に な る 。 パ イ プ に は lseek(2) を 行 う こ と は で き な い 。 パ イ プ の 容 量 パ イ プ の 容 量 に は 上 限 が あ る 。 パ イ プ が フ ル の 場 合 、 write(2) は 停 止 し た り 失 敗 し た り す る 。 ど ち ら に な る か は O_NONBLOCK フ ラ グ が セ ッ ト さ れ て い る か ど う か に 依 存 す る (下 記 参 照 )。 実 装 に よ り 、 パ イ プ の 容 量 の 上 限 は 異 な る 。 ア プ リ ケ ー シ ョ ン は 特 定 の 容 量 を 前 提 に す べ き で は な い 。 書 き 込 み 側 の プ ロ セ ス が 停 止 し た ま ま に な ら な い よ う 、 読 み 出 し 側 の プ ロ セ ス は デ ー タ が 利 用 可 能 に な っ た ら で き る だ け す ぐ に 読 み 出 し を 行 う よ う に 、 ア プ リ ケ ー シ ョ ン を 設 計 す べ き で あ る 。 バ ー ジ ョ ン 2.6.11 よ り 前 の Linux で は パ イ プ の 容 量 は シ ス テ ム の ペ ー ジ サ イ ズ と 同 じ で あ っ た (例 え ば i386 で は 4096 バ イ ト )。 Linux 2.6.11 以 降 で は 、 パ イ プ の 容 量 は 65536 バ イ ト で あ る 。 Linux 2.6.35 以 降 で は 、 パ イ プ の 容 量 の デ フ ォ ル ト 値 は 65536 バ イ ト だ が 、 パ イ プ の 容 量 を 参 照 、 設 定 を fcntl(2)F_GETPIPE_SZF_SETPIPE_SZ 操 作 を 使 っ て 行 う こ と が で き る 。 詳 細 は fcntl(2) 参 照 。

PIPE_BUF
POSIX.1−2001 で は 、 PIPE_BUF バ イ ト 以 下 の write(2) は atomic に 行 わ れ る こ と 、 つ ま り パ イ プ へ の 出 力 デ ー タ の 書 き 込 み は 連 続 し た シ ー ケ ン ス と し て 行 わ れ る こ と を 必 須 と し て い る (MUST)。 PIPE_BUF バ イ ト よ り 多 く の デ ー タ を 書 き 込 み 場 合 は atomic と は な ら な い 、 つ ま り パ イ プ へ の 他 の プ ロ セ ス に よ る デ ー タ の 書 き 込 み が 間 に 入 る 可 能 性 が あ る 。 POSIX.1−2001 の 仕 様 で は 、 PIPE_BUF は 最 小 で も 512 バ イ ト で あ る こ と が 要 求 さ れ て い る (Linux で は PIPE_BUF は 4096 バ イ ト で あ る )。 正 確 な 動 作 は 、 フ ァ イ ル デ ィ ス ク リ プ タ ー が nonblocking (O_NONBLOCK) か ど う か 、 パ イ プ へ の 書 き 込 み が 複 数 か ら 行 わ れ る か ど う か 、 お よ び 書 き 込 み を 行 う バ イ ト 数 n に よ り 決 定 さ れ る 。
O_NONBLOCK
無 効 , n <= PIPE_BUF

n バ イ ト 全 部 の 書 き 込 み が atomic に 行 わ れ る 。 n バ イ ト 分 を す ぐ に 書 き 込 む 余 地 が な い 場 合 は write(2) は 停 止 (block) す る こ と が あ る 。

O_NONBLOCK 有 効 , n <= PIPE_BUF パ イ プ に n バ イ ト を 書 き 込 む 余 地 が あ る 場 合 は 、 n バ イ ト 全 部 が す ぐ に 書 き 込 ま れ る 。 余 地 が な い 場 合 は 、 write(2) は 失 敗 し 、 errnoEAGAIN が セ ッ ト さ れ る 。
O_NONBLOCK
無 効 , n > PIPE_BUF 書 き 込 み は atomic と は な ら な い 。 write(2) に 渡 さ れ た デ ー タ の 間 に 、 他 の プ ロ セ ス に よ り write(2) さ れ た デ ー タ が 入 る こ と が あ る 。 write(2)n バ イ ト の 書 き 込 み が 完 了 す る ま で 停 止 す る 。
O_NONBLOCK
有 効 , n > PIPE_BUF パ イ プ が フ ル の 場 合 、 write(2) は 失 敗 し 、 errnoEAGAIN が セ ッ ト さ れ る 。 そ れ 以 外 の 場 合 、 1 バ イ ト 以 上 n バ イ ト 以 下 の デ ー タ が 書 き 込 ま れ る (つ ま り 「 一 部 分 だ け 書 き 込 ま れ る 」 場 合 も あ り 得 る )。 呼 び 出 し 元 は write(2) の 返 り 値 を 参 照 し 、 実 際 に 何 バ イ ト 書 き 込 ま れ た の か を 確 認 す べ き で あ る 。 ま た 、 書 き 込 み に 成 功 し た デ ー タ も 、 他 の プ ロ セ ス が 書 き 込 ん だ デ ー タ が 間 に 入 る こ と が あ る 。 オ ー プ ン フ ァ イ ル 状 態 フ ラ グ オ ー プ ン フ ァ イ ル 状 態 フ ラ グ の う ち 、 パ イ プ や FIFO に 対 し て 意 味 を 持 つ の は O_NONBLOCKO_ASYNC だ け で あ る 。 パ イ プ の 読 み 出 し 側 に O_ASYNC フ ラ グ を セ ッ ト す る と 、 パ イ プ に 新 た な 入 力 が あ る と シ グ ナ ル (デ フ ォ ル ト で は SIGIO) が 生 成 さ れ る (詳 細 は fcntl(2) を 参 照 )。 Linux で は 、 パ イ プ と FIFO に 対 す る O_ASYNC は カ ー ネ ル 2.6 以 降 で の み サ ポ ー ト さ れ て い る 。 移 植 に 関 す る 注 意 い く つ か の シ ス テ ム (Linux で は な い ) で は 、 パ イ プ は 双 方 向 で あ る 、 つ ま り パ イ プ の 両 端 間 で デ ー タ を 両 方 向 に 送 信 す る こ と が で き る 。 POSIX.1−2001 で は 、 パ イ プ は 一 方 向 の 通 信 だ け に 対 応 し て い れ ば よ い 。 移 植 を 考 慮 し た ア プ リ ケ ー シ ョ ン で は 、 双 方 向 パ イ プ の 仕 組 み を 前 提 に す べ き で は な い 。

関 連 項 目

dup(2), fcntl(2), open(2), pipe(2), poll(2), select(2), socketpair(2), stat(2), mkfifo(3), epoll(7), fifo(7)

こ の 文 書 に つ い て

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