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
はパイプを参照していなければならない。
ポインタ
iov は
iovec
構造体の配列を指す。
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
をエラーを示す値に設定する。
エラー¶
- EBADF
- fd
が有効でない、もしくはパイプを参照していない。
- EINVAL
- nr_segs が 0 もしくは
IOV_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.41 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。