Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all
名前
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/ に書かれている。