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

名前

       readv, writev, preadv, pwritev, preadv2, pwritev2 - 複数のバッファーへの読み書きを行なう

書式

       #include <sys/uio.h>

       ssize_t readv(int fd, const struct iovec *iov, int iovcnt);

       ssize_t writev(int fd, const struct iovec *iov, int iovcnt);

       ssize_t preadv(int fd, const struct iovec *iov, int iovcnt,
                      off_t offset);

       ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt,
                       off_t offset);

        ssize_t preadv2(int fd, const struct iovec *iov, int iovcnt,
                       off_t offset, int flags);

        ssize_t pwritev2(int fd, const struct iovec *iov, int iovcnt,
                        off_t offset, int flags);

   glibc 向けの機能検査マクロの要件 (feature_test_macros(7)  参照):

       preadv(), pwritev():
           Since glibc 2.19:
               _DEFAULT_SOURCE
           Glibc 2.19 and earlier:
               _BSD_SOURCE

説明

       readv()   システムコールは、ファイルディスクリプター  fd  に関連付けられた  ファイルから、
       iovcnt   個のバッファー分のデータを読み込み、   iov   で指定    されたバッファーに格納する
       ("scatter input";「ばらまき入力」)。

       writev()  システムコールは、  iov で指定されたバッファーから最大 iovcnt 個のバッファー分の
       データを取り出し、   ファイルディスクリプター   fd   に関連付けら   れたファイルに書き込む
       ("gather output";「かき集め出力」)。

       ポインター ioviovec 構造体の配列へのポインターである。 iovec 構造体は <sys/uio.h> で以
       下のように定義されている:

           struct iovec {
               void  *iov_base;    /* Starting address */
               size_t iov_len;     /* Number of bytes to transfer */
           };

       readv() システムコールは、複数のバッファーにデータを読み込む点を除いて read(2)  と全く同様
       の動作を行う。

       writev()  システムコールは、複数のバッファーのデータを書き出す点以外は write(2) と全く同様
       の動作を行う。

       バッファーは配列の順序で処理される。これは、 readv()  が iov[0] が完全に一杯になるまでデー
       タを詰めてから、  iov[1] などに進むことを意味する (データが十分ない場合は、 iov が指すバッ
       ファーのいずれも一杯にならない)。 同様に、 writev()  は iov[0]  の内容を全部書き出してから
       iov[1] などに進む。

       readv()  と writev()  によるデータ転送は atomic に行われる。つまり、 writev() によるデータ
       書き込みは一つのブロックとして行われ、他のプロセスの write  による書き込みと混ざり合うこと
       はない  (例外に関しては  pipe(7)   を参照のこと)。同様に、 readv()  はファイルから連続する
       データブロックが読み出すことが保証され、 同じファイル記述 (file description;  open(2)   参
       照)  を参照するファイルディスクリプターを持つ他のスレッドやプロセスが 実行した read 操作の
       影響を受けることはない。

   preadv()  pwritev()
       preadv() システムコールは readv() と pread(2) の機能を 組み合わせたものである。 readv() と
       同じ処理を実行するが、 4 番目の引数 offset が追加されており、 この引数は入力操作を行うファ
       イルオフセットを指定する。

       pwritev()  システムコールは  writev()  と  pwrite(2)   の機能を   組み合わせたものである。
       writev()  と同じ処理を実行するが、 4 番目の引数 offset が追加されており、 この引数は出力操
       作を行うファイルオフセットを指定する。

       これらのシステムコールで、ファイルオフセットは変更されない。 fd が参照するファイルは  seek
       可能でなければならない。

   preadv2()  pwritev2()
       These  system  calls  are  similar  to  preadv()   and  pwritev()   calls, but add a fifth
       argument, flags, which modifies the behavior on a per-call basis.

       Unlike preadv()  and pwritev(), if the offset argument is -1, then the current file offset
       is used and updated.

       The flags argument contains a bitwise OR of zero or more of the following flags:

       RWF_DSYNC (Linux 4.7 以降)
              Provide  a  per-write  equivalent  of  the  O_DSYNC  open(2)   flag.   This flag is
              meaningful only for pwritev2(), and its effect  applies  only  to  the  data  range
              written by the system call.

       RWF_HIPRI (Linux 4.6 以降)
              High  priority  read/write.   Allows  block-based filesystems to use polling of the
              device,  which  provides  lower  latency,  but  may   use   additional   resources.
              (Currently,  this  feature  is  usable  only  on a file descriptor opened using the
              O_DIRECT flag.)

       RWF_SYNC (Linux 4.7 以降)
              Provide a  per-write  equivalent  of  the  O_SYNC  open(2)   flag.   This  flag  is
              meaningful  only  for  pwritev2(),  and  its  effect applies only to the data range
              written by the system call.

       RWF_NOWAIT (Linux 4.14 以降)
              Do not wait for  data  which  is  not  immediately  available.   If  this  flag  is
              specified,  the  preadv2()   system  call will return instantly if it would have to
              read data from the  backing  storage  or  wait  for  a  lock.   If  some  data  was
              successfully read, it will return the number of bytes read.  If no bytes were read,
              it will return -1 and set errno to EAGAIN.  Currently, this flag is meaningful only
              for preadv2().

       RWF_APPEND (Linux 4.16 以降)
              Provide  a  per-write  equivalent  of  the  O_APPEND  open(2)   flag.  This flag is
              meaningful only for pwritev2(), and its effect  applies  only  to  the  data  range
              written  by  the  system  call.   The  offset  argument  does  not affect the write
              operation; the data is always appended to the end of the  file.   However,  if  the
              offset argument is -1, the current file offset is updated.

返り値

       成功した場合、  readv(), preadv, preadv2 は読み込んだバイト数を返し、 writev(), pwritev(),
       pwritev2 は書き込んだバイト数を返す。

       Note that it is not an error for a successful call to transfer fewer bytes than  requested
       (see read(2)  and write(2)).

       エラーの場合は -1 が返され、 errno が適切に設定される。

エラー

       read(2)  や write(2)  と同じエラーが定義されている。さらに、 preadv(), preadv2, pwritev(),
       pwritev2lseek(2) と同じ理由でも失敗する。また、追加で以下のエラーが定義されている:

       EINVAL iov_len の合計が ssize_t の範囲をオーバーフローした。

       EINVAL ベクタ数 iovcnt が 0 より小さいか許可された最大値よりも大きかった。

       EOPNOTSUPP
              未知のフラグが flags に指定された。

バージョン

       preadv() と pwritev() は Linux 2.6.30 で初めて登場した。 ライブラリによるサポートは  glibc
       2.10 で追加された。

       preadv2()  と  pwritev2()  は Linux 4.6 で初めて登場した。ライブラリによるサポートは glibc
       2.26 で追加された。

準拠

       readv(), writev(): POSIX.1-2001, POSIX.1-2008, 4.4BSD (これらのシステムコールは 4.2BSD  で
       初めて登場した)

       preadv(), pwritev(): 非標準だが、最近の BSD にも存在する。

       preadv2(), pwritev2(): 非標準の Linux による拡張。

注意

       POSIX.1 では、 iov で渡すことができる要素数に上限を設ける実装が認められている。 実装はこの
       上限値を広告することができ、   <limits.h>IOV_MAX    を定義することや、    実行時に
       sysconf(_SC_IOV_MAX)  の返り値経由で知ることができる。  最近の  Linux  では、 この上限値は
       1024 である。 Linux 2.0 の頃は、 この値は 16 であった。

   C ライブラリとカーネルの違い
       素のシステムコール preadv() と pwritev() のシグネチャーは、 「書式」に書かれている対応する
       GNU  C ライブラリのラッパー関数のものとは少し異なる。 最後の引数 offset はラッパー関数によ
       りシステムコールの 2 つの引数に展開される。

        unsigned long pos_l, unsigned long pos

       これらの引数は、それぞれ、 offset の下位 32 ビットと上位 32 ビットである。

   以前の C ライブラリとカーネルの違い
       古いバージョンの Linux では IOV_MAX が非常に小さかったという事実に対処するため、 glibc  の
       readv()  と writev() のラッパー関数は、 その関数の内部で呼ばれるカーネルシステムコールがこ
       の上限を超過して失敗したことを検出すると、 追加の動作をしていた。  readv()  の場合、  ラッ
       パー関数は     iov    で指定された全ての要素を格納できる大きさの一時バッファーを割り当て、
       read(2)  を呼び出す際にそのバッファーを渡し、  そのバッファーのデータを   iov   の各要素の
       iov_base     フィールドが指定する場所にコピーしてから、     そのバッファーを解放していた。
       writev() のラッパー関数も、 同じように一時バッファーを使って write(2) を呼び出していた。

       glibc ラッパー関数でのこの追加の動作は Linux 2.2 以降では必要なくなった。  しかし、  glibc
       はバージョン  2.10  まではこの動作を続けていた。 glibc 2.9 以降では、 システムがバージョン
       2.6.18 より前の Linux カーネル (2.6.18 は勝手に選択したカーネルバージョンである)  を実行し
       ているとライブラリが検出した場合にのみ、  ラッパー関数はこの動作を行う。 glibc 2.20 以降で
       は、 (Linux カーネルのバージョン 2.6.32 以降が必須条件となり) glibc のラッパー関数は常にシ
       ステムコールを直接呼び出すようになっている。

       以下のサンプルコードは writev()  の使用方法を示すものである。

           char *str0 = "hello ";
           char *str1 = "world\n";
           struct iovec iov[2];
           ssize_t nwritten;

           iov[0].iov_base = str0;
           iov[0].iov_len = strlen(str0);
           iov[1].iov_base = str1;
           iov[1].iov_len = strlen(str1);

           nwritten = writev(STDOUT_FILENO, iov, 2);

関連項目

       pread(2), read(2), write(2)

この文書について

       この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの
       説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。