OSDN Git Service

Update README
[linuxjm/LDP_man-pages.git] / release / man2 / readv.2
index 89f1683..e9c50d7 100644 (file)
@@ -1,8 +1,7 @@
-.\" Hey Emacs! This file is -*- nroff -*- source.
-.\"
-.\" Copyright (C) 2007 Michael Kerrisk <mtk.manpages@gmail.com>
+.\" Copyright (C) 2007, 2010 Michael Kerrisk <mtk.manpages@gmail.com>
 .\" and Copyright (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de)
 .\"
+.\" %%%LICENSE_START(VERBATIM)
 .\" Permission is granted to make and distribute verbatim copies of this
 .\" manual provided the copyright notice and this permission notice are
 .\" preserved on all copies.
 .\"
 .\" Formatted or processed versions of this manual, if unaccompanied by
 .\" the source, must acknowledge the copyright and authors of this work.
-.\" License.
+.\" %%%LICENSE_END
+.\"
 .\" Modified Sat Jul 24 18:34:44 1993 by Rik Faith (faith@cs.unc.edu)
 .\" Merged readv.[23], 2002-10-17, aeb
 .\" 2007-04-30 mtk, A fairly major rewrite to fix errors and
 .\"     add more details.
+.\" 2010-11-16, mtk, Added documentation of preadv() and pwritev()
+.\"
+.\"*******************************************************************
 .\"
-.\" 1996-04-12 Tom Bjorkholm <tomb@mydata.se>
-.\"            First version written
-.\" Modified Tue Oct 22 17:41:07 1996 by Eric S. Raymond <esr@thyrsus.com>
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
 .\"
 .\" Japanese Version Copyright (c) 1997-1999 HANATAKA Shinya
 .\"         all rights reserved.
 .\" Updated 2003-01-14, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
 .\" Updated 2005-10-07, Akihiro MOTOKI
 .\" Updated 2007-06-01, Akihiro MOTOKI, LDP v2.50
+.\" Updated 2012-05-08, Akihiro MOTOKI <amotoki@gmail.com>
+.\" Updated 2013-03-26, Akihiro MOTOKI <amotoki@gmail.com>
 .\"
-.\"WORD:       vector                  ベクタ (vector)
-.\"WORD:       file descriptor         ファイルディスクリプタ
-.\"WORD:       buffer                  バッファ
-.\"
-.TH READV 2  2002-10-17 "Linux" "Linux Programmer's Manual"
+.TH READV 2 2015\-01\-22 Linux "Linux Programmer's Manual"
 .SH 名前
-readv, writev \- 複数のバッファへの読み書きを行なう
+readv, writev, preadv, pwritev \- 複数のバッファーへの読み書きを行なう
 .SH 書式
 .nf
-.B #include <sys/uio.h>
+\fB#include <sys/uio.h>\fP
 .sp
-.BI "ssize_t readv(int " fd ", const struct iovec *" iov ", int " iovcnt );
+\fBssize_t readv(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB);\fP
 .sp
-.BI "ssize_t writev(int " fd ", const struct iovec *" iov ", int " iovcnt );
+\fBssize_t writev(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB);\fP
+.sp
+\fBssize_t preadv(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB,\fP
+\fB               off_t \fP\fIoffset\fP\fB);\fP
+.sp
+\fBssize_t pwritev(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB,\fP
+\fB                off_t \fP\fIoffset\fP\fB);\fP
 .fi
+.sp
+.in -4n
+glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7)  参照):
+.in
+.sp
+\fBpreadv\fP(), \fBpwritev\fP(): _BSD_SOURCE
 .SH 説明
-.BR readv ()
-関数は、ファイルディスクリプタ
-.I fd
-に関連付けられたファイルから、
-.I iovcnt
-個のバッファ分のデータを読み込み、
-.I iov
-で指定されたバッファに格納する
-("scatter input";「ばらまき入力」)。
+\fBreadv\fP() システムコールは、ファイルディスクリプター \fIfd\fP に関連付けられた
+ファイルから、 \fIiovcnt\fP 個のバッファー分のデータを読み込み、 \fIiov\fP で指定
+されたバッファーに格納する ("scatter input";「ばらまき入力」)。
 .PP
-.BR writev ()
-関数は、
-.I iov
-で指定されたバッファから最大
-.I iovcnt
-個のバッファ分のデータを取り出し、
-ファイルディスクリプタ
-.I fd
-に関連付けられたファイルに書き込む
-("gather output";「かき集め出力」)。
+\fBwritev\fP() システムコールは、 \fIiov\fP で指定されたバッファーから最大 \fIiovcnt\fP
+個のバッファー分のデータを取り出し、 ファイルディスクリプター \fIfd\fP に関連付けら
+れたファイルに書き込む ("gather output";「かき集め出力」)。
 .PP
-ポインタ
-.I iov
-は
-.I iovec
-構造体の配列へのポインタである。
-.I iovec
-構造体は
-.I <sys/uio.h>
-で以下のように定義されている:
+ポインター \fIiov\fP は \fIiovec\fP 構造体の配列へのポインターである。 \fIiovec\fP 構造体は
+\fI<sys/uio.h>\fP で以下のように定義されている:
 .PP
 .br
 .in +4n
@@ -97,130 +90,102 @@ struct iovec {
 .fi
 .in
 .PP
-.BR readv ()
-関数は、複数のバッファにデータを読み込む点を除いて
-.BR read (2)
-と全く同様の動作を行う。
+\fBreadv\fP() システムコールは、複数のバッファーにデータを読み込む点を除いて
+\fBread\fP(2) と全く同様の動作を行う。
 .PP
-.BR writev ()
-関数は、複数のバッファのデータを書き出す点以外は
-.BR write (2)
-と全く同様の動作を行う。
+\fBwritev\fP() システムコールは、複数のバッファーのデータを書き出す点以外は
+\fBwrite\fP(2) と全く同様の動作を行う。
 .PP
-バッファは配列の順序で処理される。これは、
-.BR readv ()
-が
-.IR iov [0]
-が完全に一杯になるまでデータを詰めてから、
-.IR iov [1]
-などに進むことを意味する
-(データが十分ない場合は、
-.I iov
-が指すバッファのいずれも一杯にならない)。
-同様に、
-.BR writev ()
-は
-.IR iov [0]
-の内容を全部書き出してから
-.IR iov [1]
-などに進む。
+バッファーは配列の順序で処理される。これは、 \fBreadv\fP()  が \fIiov\fP[0] が完全に一杯になるまでデータを詰めてから、
+\fIiov\fP[1] などに進むことを意味する (データが十分ない場合は、 \fIiov\fP が指すバッファーのいずれも一杯にならない)。 同様に、
+\fBwritev\fP()  は \fIiov\fP[0] の内容を全部書き出してから \fIiov\fP[1] などに進む。
 .PP
-.BR readv ()
-と
-.BR writev ()
-によるデータ転送は atomic に行われる。つまり、
-.BR writev ()
-によるデータ書き込みは一つのブロックとして行われ、他のプロセスの
-write による書き込みと混ざり合うことはない
-(例外に関しては
-.BR pipe (7)
-を参照のこと)。同様に、
-.BR readv ()
-はファイルから連続するデータブロックが読み出すことが保証され、
-同じファイル記述 (file description;
-.BR open (2)
-参照) を参照するファイルディスクリプタを持つ他のスレッドやプロセスが
+\fBreadv\fP()  と \fBwritev\fP()  によるデータ転送は atomic に行われる。つまり、 \fBwritev\fP()
+によるデータ書き込みは一つのブロックとして行われ、他のプロセスの write による書き込みと混ざり合うことはない (例外に関しては
+\fBpipe\fP(7)  を参照のこと)。同様に、 \fBreadv\fP()  はファイルから連続するデータブロックが読み出すことが保証され、
+同じファイル記述 (file description; \fBopen\fP(2)  参照) を参照するファイルディスクリプターを持つ他のスレッドやプロセスが
 実行した read 操作の影響を受けることはない。
+.SS "preadv() と pwritev()"
+\fBpreadv\fP() システムコールは \fBreadv\fP() と \fBpreadv\fP(2) の機能を
+組み合わせたものである。
+\fBreadv\fP() と同じ処理を実行するが、
+4 番目の引き数 \fIoffset\fP が追加されており、
+この引き数は入力操作を行うファイルオフセットを指定する。
+
+\fBpwritev\fP() システムコールは \fBwritev\fP() と \fBpwrite\fP(2) の機能を
+組み合わせたものである。
+\fBwritev\fP() と同じ処理を実行するが、
+4 番目の引き数 \fIoffset\fP が追加されており、
+この引き数は出力操作を行うファイルオフセットを指定する。
+
+これらのシステムコールで、ファイルオフセットは変更されない。
+\fIfd\fP が参照するファイルは seek 可能でなければならない。
 .SH 返り値
-成功した場合、
-.BR readv ()
-関数は読み込んだバイト数を返し、
-.BR writev ()
-関数は書き込んだバイト数を返す。
+成功した場合、 \fBreadv\fP() と \fBpreadv\fP は読み込んだバイト数を返し、
+\fBwritev\fP() と \fBpwritev\fP()は書き込んだバイト数を返す。
 エラーの場合 \-1 を返し、\fIerrno\fP を適切に設定する。
 .SH エラー
-.BR read (2)
-や
-.BR write (2)
-と同じエラーが定義されている。
-さらに以下のエラーが定義されている:
-.TP
-.B EINVAL
-.I iov_len
-の合計が
-.I ssize_t
-の範囲をオーバーフローした。もしくは、
+\fBread\fP(2)  や \fBwrite\fP(2)  と同じエラーが定義されている。
+さらに、 \fBpreadv\fP() と \fBpwritev\fP() は \fBlseek\fP(2) と同じ理由でも失敗する。
+また、追加で以下のエラーが定義されている:
+.TP 
+\fBEINVAL\fP
+\fIiov_len\fP の合計が \fIssize_t\fP の範囲をオーバーフローした。
+.TP 
+\fBEINVAL\fP
 ベクタ数 \fIiovcnt\fP が 0 より小さいか許可された最大値よりも大きかった。
+.SH バージョン
+\fBpreadv\fP() と \fBpwritev\fP() は Linux 2.6.30 で初めて登場した。
+ライブラリによるサポートは glibc 2.10 で追加された。
 .SH 準拠
-4.4BSD
-.RB ( readv ()
-と
-.BR writev ()
-関数は 4.2BSD で最初に現われた)、POSIX.1-2001。
-Linux libc5 では \fIiovcnt\fP 引き数の型として \fIsize_t\fP を、
-これらの関数の返り値として \fIint\fP を使用していた。
-.\" readv/writev システムコールは Linux 1.3.40 以前はバグだらけであった
-.\" (と release.libc に書かれている)。
+.\" Linux libc5 used \fIsize_t\fP as the type of the \fIiovcnt\fP argument,
+.\" and \fIint\fP as the return type.
+.\" The readv/writev system calls were buggy before Linux 1.3.40.
+.\" (Says release.libc.)
+\fBreadv\fP(), \fBwritev\fP(): 4.4BSD (これらのシステムコールは 4.2BSD で初めて登場した),
+POSIX.1\-2001.
+
+\fBpreadv\fP(), \fBpwritev\fP(): 非標準だが、最近の BSD にも存在する。
 .SH 注意
-.SS "Linux での注意"
-POSIX.1-2001 では、
-.I iov
-で渡すことができる要素数に上限を設ける実装が認められている。
-実装は、
-.I <limits.h>
-の
-.B IOV_MAX
-を定義することや、実行時に
-.I sysconf(_SC_IOV_MAX)
-の返り値経由で、この上限を広告することができる。
-Linux では、この仕組みにより広告される上限は 1024 であり、
-この値はカーネルでの上限そのものである。
-一方で、glibc のラッパー関数は、その関数の内部で呼ばれるカーネル・
-システムコールがこの上限を超過して失敗したことを検出すると、
-追加の動作をする。
-.BR readv ()
-の場合、ラッパー関数は
-.I iov
-で指定された全ての要素を格納できる大きさの一時バッファを割り当て、
-.BR read (2)
-を呼び出す際にそのバッファを渡し、
-そのバッファのデータを
-.I iov
-の各要素の
-.I iov_base
-フィールドが指定する場所にコピーしてから、
-そのバッファを解放する。
-.BR writev ()
-のラッパー関数も、同じように一時バッファを使って
-.BR write (2)
-を呼び出す。
+POSIX.1\-2001 では、 \fIiov\fP で渡すことができる要素数に上限を設ける実装が認められている。 実装はこの上限値を広告することができ、
+\fI<limits.h>\fP の \fBIOV_MAX\fP を定義することや、 実行時に \fIsysconf(_SC_IOV_MAX)\fP
+の返り値経由で知ることができる。 最近の Linux では、 この上限値は 1024 である。 Linux 2.0 の頃は、 この値は 16 であった。
+
+
+.\"
+.\"
+.SS "C ライブラリとカーネル ABI の違い"
+素のシステムコール \fBpreadv\fP() と \fBpwritev\fP() のシグネチャーは、 「書式」に書かれている対応する GNU C
+ライブラリのラッパー関数のものとは少し異なる。 最後の引き数 \fIoffset\fP はラッパー関数によりシステムコールの 2 つの引き数に展開される。
+
+\fB unsigned long \fP\fIpos_l\fP\fB, unsigned long \fP\fIpos\fP
+
+これらの引き数は、それぞれ、 \fIoffset\fP の下位 32 ビットと上位 32 ビットである。
+.SS "以前の C ライブラリとカーネル ABI の違い"
+古いバージョンの Linux では \fBIOV_MAX\fP が非常に小さかったという事実に対処するため、 glibc の \fBreadv\fP() と
+\fBwritev\fP() のラッパー関数は、 その関数の内部で呼ばれるカーネルシステムコールがこの上限を超過して失敗したことを検出すると、
+追加の動作をしていた。 \fBreadv\fP() の場合、 ラッパー関数は \fIiov\fP
+で指定された全ての要素を格納できる大きさの一時バッファーを割り当て、 \fBread\fP(2) を呼び出す際にそのバッファーを渡し、
+そのバッファーのデータを \fIiov\fP の各要素の \fIiov_base\fP フィールドが指定する場所にコピーしてから、 そのバッファーを解放していた。
+\fBwritev\fP() のラッパー関数も、 同じように一時バッファーを使って \fBwrite\fP(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
+のラッパー関数は常にシステムコールを直接呼び出すようになっている。
 .SH バグ
-.BR readv ()
-や
-.BR writev ()
-のようなファイルディスクリプタに対する操作を行う関数と、
+ファイルディスクリプターに対する操作を行う \fBreadv\fP() や \fBwritev\fP() と、
 標準入出力ライブラリの関数をごちゃまぜにして呼ぶのはお薦めしない。
-どんな結果になるかは定義されておらず、
-おそらく欲しい結果は得られないだろう。
+どんな結果になるかは定義されておらず、おそらく期待する結果は
+得られないだろう。
 .SH 例
-以下のサンプルコードは
-.BR writev ()
-の使用方法を示すものである。
+以下のサンプルコードは \fBwritev\fP()  の使用方法を示すものである。
 
 .in +4n
 .nf
 char *str0 = "hello ";
-char *str1 = "world\\n";
+char *str1 = "world\en";
 struct iovec iov[2];
 ssize_t nwritten;
 
@@ -233,5 +198,8 @@ nwritten = writev(STDOUT_FILENO, iov, 2);
 .fi
 .in
 .SH 関連項目
-.BR read (2),
-.BR write (2)
+\fBpread\fP(2), \fBread\fP(2), \fBwrite\fP(2)
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。