Manpages

名 前

vmsplice − ユ ー ザ ー ペ ー ジ を パ イ プ に 継 ぎ 合 わ せ る

書 式

#define _GNU_SOURCE /* feature_test_macros(7) 参 照 */
#include <fcntl.h>
#include <sys/uio.h>

ssize_t vmsplice(int fd, const struct iovec *iov,
unsigned long
nr_segs, unsigned int flags);

説 明

vmsplice() シ ス テ ム コ ー ル は 、 iov で 指 定 さ れ た ユ ー ザ ー メ モ リ ー の nr_segs の 範 囲 を パ イ プ に マ ッ ピ ン グ す る 。 fd は パ イ プ を 参 照 し て い な け れ ば な ら な い 。 ポ イ ン タ ー ioviovec 構 造 体 の 配 列 を 指 す 。 iovec 構 造 体 は <sys/uio.h> で 以 下 の よ う に 定 義 さ れ て い る :

struct iovec {
void *iov_base; /* 開 始 ア ド レ ス */
size_t iov_len; /* バ イ ト 数 */ };

flags 引 き 数 に は 、 以 下 の 値 の 0 個 以 上 を ビ ッ ト 毎 の 論 理 和 の 形 で 指 定 す る 。

SPLICE_F_MOVE

vmsplice() で は 未 使 用 。 splice(2) 参 照 。

SPLICE_F_NONBLOCK

入 出 力 で 停 止 (block) し な い 。 詳 細 は splice(2) 参 照 。

SPLICE_F_MORE

現 在 の と こ ろ vmsplice() で は 何 の 効 果 も な い が 、 将 来 的 に は 実 装 さ れ る 可 能 性 が あ る 。 splice(2) 参 照 。

SPLICE_F_GIFT

ユ ー ザ ー ペ ー ジ が カ ー ネ ル へ 渡 す も の (gift) で あ る こ と を 示 す 。 ア プ リ ケ ー シ ョ ン は こ の メ モ リ ー を 絶 対 に 変 更 し て は な ら な い 。 さ も な け れ ば 、 ペ ー ジ キ ャ ッ シ ュ と デ ィ ス ク 上 の デ ー タ は 一 致 し な く な る だ ろ う 。 ペ ー ジ を カ ー ネ ル に 渡 す と 、 こ の 次 の splice(2) SPLICE_F_MOVE で そ の ペ ー ジ の 移 動 を 行 う こ と が で き る 。 こ の フ ラ グ が 指 定 さ れ な か っ た 場 合 、 こ の 次 の splice(2) SPLICE_F_MOVE で そ の ペ ー ジ の コ ピ ー を 行 わ な け れ ば な ら な い 。 デ ー タ は メ モ リ ー 上 で ペ ー ジ 境 界 に あ っ て い な け れ ば な ら ず 、 長 さ も ペ ー ジ 境 界 の 倍 数 で な け れ ば な ら な い 。

返 り 値

成 功 し て 完 了 す る と 、 vmsplice() は パ イ プ に 転 送 し た バ イ ト 数 を 返 す 。 エ ラ ー の 場 合 、 vmplice() は −1 を 返 し 、 errno を エ ラ ー を 示 す 値 に 設 定 す る 。

エ ラ ー

EAGAIN

SPLICE_F_NONBLOCKflags に 指 定 さ れ て い て 、 か つ 操 作 が 停 止 す る よ う な 状 態 で あ っ た 。

EBADF

fd が 有 効 で な い 、 も し く は パ イ プ を 参 照 し て い な い 。

EINVAL

nr_segsIOV_MAX よ り も 大 き い 。 ま た は SPLICE_F_GIFT が 設 定 さ れ た が メ モ リ ー が ペ ー ジ 境 界 に あ っ て い な い 。

ENOMEM

メ モ リ ー 不 足 。

バ ー ジ ョ ン

vmsplice() シ ス テ ム コ ー ル は Linux 2.6.17 で 初 め て 登 場 し た 。 ラ イ ブ ラ リ に よ る サ ポ ー ト は glibc バ ー ジ ョ ン 2.5 で 追 加 さ れ た 。

準 拠

こ の シ ス テ ム コ ー ル は Linux 固 有 で あ る 。

注 意

指 定 さ れ た セ グ メ ン ト 数 が 上 限 に 達 し た 場 合 、 vmsplice() は 他 の ベ ク ト ル 形 式 の read/write を 行 う 関 数 と 同 じ 動 作 を す る 。 上 限 は IOV_MAX で あ り 、 <limits.h> で 定 義 さ れ て い る 。 こ の ド キ ュ メ ン ト を 書 い た 時 点 で の 値 は 1024 で あ る 。

関 連 項 目

splice(2), tee(2)

こ の 文 書 に つ い て

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