名 前
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_SZ と F_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) は
失 敗 し 、 errno に
EAGAIN が セ ッ ト さ
れ る 。
O_NONBLOCK 無 効 , n >
PIPE_BUF 書 き 込 み は
atomic と は な ら な い
。 write(2) に 渡 さ れ
た デ ー タ の 間
に 、 他 の プ ロ
セ ス に よ り write(2)
さ れ た デ ー タ
が 入 る こ と が
あ る 。 write(2) は n
バ イ ト の 書 き
込 み が 完 了 す
る ま で 停 止 す
る 。
O_NONBLOCK 有 効 , n >
PIPE_BUF パ イ プ が フ
ル の 場 合 、 write(2)
は 失 敗 し 、 errno
に EAGAIN が セ ッ ト
さ れ る 。 そ れ
以 外 の 場 合 、 1
バ イ ト 以 上 n
バ イ ト 以 下 の
デ ー タ が 書 き
込 ま れ る (つ ま
り 「 一 部 分 だ
け 書 き 込 ま れ
る 」 場 合 も あ
り 得 る )。 呼 び
出 し 元 は write(2) の
返 り 値 を 参 照
し 、 実 際 に 何
バ イ ト 書 き 込
ま れ た の か を
確 認 す べ き で
あ る 。 ま た 、
書 き 込 み に 成
功 し た デ ー タ
も 、 他 の プ ロ
セ ス が 書 き 込
ん だ デ ー タ が
間 に 入 る こ と
が あ る 。 オ ー
プ ン フ ァ イ ル
状 態 フ ラ グ オ
ー プ ン フ ァ イ
ル 状 態 フ ラ グ
の う ち 、 パ イ
プ や FIFO に 対 し て
意 味 を 持 つ の
は O_NONBLOCK と O_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/ に 書 か れ て い る 。