Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all bug

名前

       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.

       ポインター 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 である。

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