名 前
splice − パ イ プ と の 間 で デ ー タ を 継 ぎ 合 わ せ る
書 式
#define
_GNU_SOURCE /* feature_test_macros(7) 参 照
*/
#include <fcntl.h>
ssize_t
splice(int fd_in, loff_t
*off_in, int fd_out,
loff_t *off_out, size_t len,
unsigned int flags);
説 明
splice() は 、 カ ー ネ ル ア ド レ ス 空 間 と ユ ー ザ ー ア ド レ ス 空 間 と の 間 の コ ピ ー を 伴 わ ず に 、 2 つ の フ ァ イ ル デ ィ ス ク リ プ タ ー 間 で デ ー タ の 移 動 を 行 う 。 フ ァ イ ル デ ィ ス ク リ プ タ ー fd_in か ら フ ァ イ ル デ ィ ス ク リ プ タ ー fd_out へ 最 大 len バ イ ト を 転 送 す る 。 2 つ の フ ァ イ ル デ ィ ス ク リ プ タ ー の う ち 一 つ は パ イ プ を 参 照 し て い な け れ ば な ら な い 。
fd_in と off_in に は 以 下 の ル ー ル が 適 用 さ れ る 。
* |
fd_in が パ イ プ を 参 照 し て い る 場 合 、 off_in は NULL で な け れ ば な ら な い 。 | ||
* |
fd_in が パ イ プ を 参 照 し て お ら ず 、 か つ off_in が NULL の 場 合 、 バ イ ト は fd_in の 現 在 の フ ァ イ ル オ フ セ ッ ト か ら 読 み 出 さ れ 、 現 在 の フ ァ イ ル オ フ セ ッ ト は 適 切 に 調 整 さ れ る 。 | ||
* |
fd_in が パ イ プ を 参 照 し て お ら ず 、 off_in が NULL で な い 場 合 、 off_in は fd_in か ら の デ ー タ 読 み 出 し を 開 始 す る 先 頭 オ フ セ ッ ト を 格 納 し た バ ッ フ ァ ー へ の ポ イ ン タ ー で な け れ ば な ら な い 。 こ の 場 合 、 fd_in の 現 在 の フ ァ イ ル オ フ セ ッ ト は 変 更 さ れ な い 。 |
fd_out と off_out に 関 し て も 同 様 で あ る 。
flags 引 き 数 に は 、 以 下 の 値 の 0 個 以 上 を ビ ッ ト 毎 の 論 理 和 の 形 で 指 定 す る 。
SPLICE_F_MOVE ペ ー ジ の コ ピ ー で な く 移 動 を 試 み る 。 こ れ は カ ー ネ ル に 対 す る ヒ ン ト で し か な い 。 つ ま り 、 カ ー ネ ル が パ イ プ か ら ペ ー ジ を 移 動 で き な い 場 合 や 、 パ イ プ バ ッ フ ァ ー が ペ ー ジ 全 部 を 参 照 し て い な い 場 合 は 、 ペ ー ジ の コ ピ ー が 行 わ れ る こ と も あ る 。 こ の フ ラ グ の 最 初 の 実 装 に は バ グ が あ っ た 。 そ の た め 、 |
Linux 2.6.21 以 降 で は こ の フ ラ グ の 操 作 は で き な い よ う に な っ て い る (た だ し 、 splice() コ ー ル で こ の フ ラ グ を 指 定 す る こ と は 今 も 認 め ら れ て い る )。 将 来 、 正 し い 実 装 が 行 わ れ る こ と だ ろ う 。
SPLICE_F_NONBLOCK 入 出 力 時 に 停 止 |
(block) し な い 。 こ の フ ラ グ を 指 定 す る |
と 、 splice に よ る パ イ プ 操 作 を 非 停 止 モ ー ド (nonblocking) で 行 お う と す る が 、 そ の 場 合 で も splice() は 停 止 す る こ と も あ る 。 な ぜ な ら 、 デ ー タ の や り 取 り を 行 う フ ァ イ ル デ ィ ス ク リ プ タ ー は (O_NONBLOCK フ ラ グ を セ ッ ト さ れ て い な い 場 合 ) 停 止 す る 可 能 性 が あ る か ら で あ る 。
SPLICE_F_MORE こ の 後 の |
splice で さ ら に 転 送 さ れ る デ ー タ が あ る こ と を |
示 す 。 こ の フ ラ グ は fd_out が ソ ケ ッ ト を 参 照 し て い る 場 合 に 有 用 な ヒ ン ト と な る (send(2) の MSG_MORE や tcp(7) の TCP_CORK の 説 明 も 参 照 )。
SPLICE_F_GIFT |
splice() で は 使 用 し な い 。 vmsplice(2) 参 照 。 |
返 り 値
成 功 し て 完 了 す る と 、 splice() は パ イ プ か ら 出 し 入 れ し た バ イ ト 数 を 返 す 。 返 り 値 0 は デ ー タ の 転 送 が 行 わ な か っ た こ と を 示 す 。 こ の 場 合 、 処 理 を 停 止 (block) し て も 無 意 味 で あ る 。 な ぜ な ら 、 fd_in が 参 照 す る パ イ プ の 書 き 込 み 側 に 接 続 さ れ て い る 者 が い な い か ら で あ る 。 エ ラ ー の 場 合 、 splice() は −1 を 返 し 、 errno に エ ラ ー を 示 す 値 を 設 定 す る 。
エ ラ ー
EAGAIN |
SPLICE_F_NONBLOCK が flags に 指 定 さ れ て い て 、 か つ 操 作 が 停 止 す る よ う な 状 態 で あ っ た 。
フ ァ イ ル デ ィ ス ク リ プ タ ー の 一 方 ま た は 両 方 が 有 効 で は な い 、 も し く は 適 切 な read−write モ ー ド で は な い 。
イ ル シ
ス テ ム が splice に 対
応 し て い な い
、 ま た は 対 象
の フ ァ イ ル が
追 記 モ ー ド で
オ ー プ ン さ れ
て い る 、 ま た
は デ ィ ス ク リ
プ タ ー の ど ち
ら も パ イ プ を
参 照 し て い な
い 、 ま た は seek で
き な い デ バ イ
ス に 対 し て オ
フ セ ッ ト が 指
定 さ れ た 。 メ モ リ ー 不 足 。
バ ー ジ ョ ンsplice() シ ス テ ム コ ー ル は Linux 2.6.17 で 初 め て 登 場 し た 。 ラ イ ブ ラ リ に よ る サ ポ ー ト は glibc バ ー ジ ョ ン 2.5 で 追 加 さ れ た 。 準 拠こ の シ ス テ ム コ ー ル は Linux 固 有 で あ る 。 注 意3 つ の シ ス テ ム コ ー ル (splice(), vmsplice(2), tee(2)) を 使 う と 、 ユ ー ザ ー 空 間 プ ロ グ ラ ム は 任 意 の カ ー ネ ル バ ッ フ ァ ー に 対 す る 完 全 な 制 御 が で き る 。 カ ー ネ ル バ ッ フ ァ ー は 、 パ イ プ に 使 用 さ れ て い る の と 同 種 の バ ッ フ ァ ー を 使 っ て カ ー ネ ル 内 に 実 装 さ れ て い る 。 大 ま か に い う と 、 こ れ ら の シ ス テ ム コ ー ル は 以 下 の 仕 事 を 行 う :
(出 力 バ ッ フ ァ ー 用 の ) ポ イ ン タ ー を 新 規 に 作 成 す る こ と で バ ッ フ ァ ー 内 の ペ ー ジ の 「 コ ピ ー 」 を 作 成 し 、 そ の ペ ー ジ の 参 照 回 数 を 増 や す 。 つ ま り 、 ポ イ ン タ ー だ け が コ ピ ー さ れ 、 バ ッ フ ァ ー の ペ ー ジ は コ ピ ー さ れ な い 。 例tee(2) 参 照 。 関 連 項 目sendfile(2), tee(2), vmsplice(2) こ の 文 書 に つ い てこ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。 |