VMSPLICE
Section: Linux Programmer's Manual (2)
Updated: 2019-03-06
Index
JM Home Page
roff page
名前
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);
説明
If fd is opened for writing, the vmsplice() system call maps
nr_segs ranges of user memory described by iov into a pipe. If fd
is opened for reading, the vmsplice() system call fills nr_segs
ranges of user memory described by iov from a pipe. The file descriptor
fd must refer to a pipe.
ポインター 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 をエラーを示す値に設定する。
エラー
- EAGAIN
-
SPLICE_F_NONBLOCK が flags に指定されていて、かつ操作が停止するような状態であった。
- EBADF
-
fd が有効でない、もしくはパイプを参照していない。
- EINVAL
-
nr_segs が IOV_MAX よりも大きい。または SPLICE_F_GIFT
が設定されたがメモリーがページ境界にあっていない。
- ENOMEM
-
メモリー不足。
バージョン
vmsplice() システムコールは Linux 2.6.17 で初めて登場した。
ライブラリによるサポートは glibc バージョン 2.5 で追加された。
準拠
このシステムコールは Linux 固有である。
注意
指定されたセグメント数が上限に達した場合、 vmsplice() は他のベクトル形式の read/write を行う関数と同じ動作をする。
上限は IOV_MAX であり、 <limits.h> で定義されている。現時点では、この値は 1024 である。
vmsplice() really supports true splicing only from user memory to a
pipe. In the opposite direction, it actually just copies the data to
userspace. But this makes the interface nice and symmetric and enables
people to build on vmsplice() with room for future improvement in
performance.
関連項目
splice(2), tee(2), pipe(7)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/ に書かれている。
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- エラー
-
- バージョン
-
- 準拠
-
- 注意
-
- 関連項目
-
- この文書について
-
This document was created by
man2html,
using the manual pages.
Time: 03:33:35 GMT, December 05, 2022