VMSPLICE(2)

名前
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/ に書かれている。