X-Git-Url: http://git.osdn.net/view?p=linuxjm%2FLDP_man-pages.git;a=blobdiff_plain;f=release%2Fman2%2Freadv.2;h=e9c50d7cf25b549c11f9be773f00948565661031;hp=e5ca0b2b043389d9652753911f3bc181ff73a1bd;hb=83f9e5d087c3464d5131604d3c9893479e6228eb;hpb=a2b0f650fa5e3f097a33752f9ee5626f8d678fd8 diff --git a/release/man2/readv.2 b/release/man2/readv.2 index e5ca0b2b..e9c50d7c 100644 --- a/release/man2/readv.2 +++ b/release/man2/readv.2 @@ -45,9 +45,9 @@ .\" Updated 2012-05-08, Akihiro MOTOKI .\" Updated 2013-03-26, Akihiro MOTOKI .\" -.TH READV 2 2010\-11\-17 Linux "Linux Programmer's Manual" +.TH READV 2 2015\-01\-22 Linux "Linux Programmer's Manual" .SH 名前 -readv, writev, preadv, pwritev \- 複数のバッファへの読み書きを行なう +readv, writev, preadv, pwritev \- 複数のバッファーへの読み書きを行なう .SH 書式 .nf \fB#include \fP @@ -69,16 +69,16 @@ glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7) 参 .sp \fBpreadv\fP(), \fBpwritev\fP(): _BSD_SOURCE .SH 説明 -\fBreadv\fP() システムコールは、ファイルディスクリプタ \fIfd\fP に関連付けられた -ファイルから、 \fIiovcnt\fP 個のバッファ分のデータを読み込み、 \fIiov\fP で指定 -されたバッファに格納する ("scatter input";「ばらまき入力」)。 +\fBreadv\fP() システムコールは、ファイルディスクリプター \fIfd\fP に関連付けられた +ファイルから、 \fIiovcnt\fP 個のバッファー分のデータを読み込み、 \fIiov\fP で指定 +されたバッファーに格納する ("scatter input";「ばらまき入力」)。 .PP -\fBwritev\fP() システムコールは、 \fIiov\fP で指定されたバッファから最大 \fIiovcnt\fP -個のバッファ分のデータを取り出し、 ファイルディスクリプタ \fIfd\fP に関連付けら +\fBwritev\fP() システムコールは、 \fIiov\fP で指定されたバッファーから最大 \fIiovcnt\fP +個のバッファー分のデータを取り出し、 ファイルディスクリプター \fIfd\fP に関連付けら れたファイルに書き込む ("gather output";「かき集め出力」)。 .PP -ポインタ \fIiov\fP は \fIiovec\fP 構造体の配列へのポインタである。 \fIiovec\fP 構造体は \fI\fP -で以下のように定義されている: +ポインター \fIiov\fP は \fIiovec\fP 構造体の配列へのポインターである。 \fIiovec\fP 構造体は +\fI\fP で以下のように定義されている: .PP .br .in +4n @@ -90,20 +90,20 @@ struct iovec { .fi .in .PP -\fBreadv\fP() システムコールは、複数のバッファにデータを読み込む点を除いて +\fBreadv\fP() システムコールは、複数のバッファーにデータを読み込む点を除いて \fBread\fP(2) と全く同様の動作を行う。 .PP -\fBwritev\fP() システムコールは、複数のバッファのデータを書き出す点以外は +\fBwritev\fP() システムコールは、複数のバッファーのデータを書き出す点以外は \fBwrite\fP(2) と全く同様の動作を行う。 .PP -バッファは配列の順序で処理される。これは、 \fBreadv\fP() が \fIiov\fP[0] が完全に一杯になるまでデータを詰めてから、 -\fIiov\fP[1] などに進むことを意味する (データが十分ない場合は、 \fIiov\fP が指すバッファのいずれも一杯にならない)。 同様に、 +バッファーは配列の順序で処理される。これは、 \fBreadv\fP() が \fIiov\fP[0] が完全に一杯になるまでデータを詰めてから、 +\fIiov\fP[1] などに進むことを意味する (データが十分ない場合は、 \fIiov\fP が指すバッファーのいずれも一杯にならない)。 同様に、 \fBwritev\fP() は \fIiov\fP[0] の内容を全部書き出してから \fIiov\fP[1] などに進む。 .PP \fBreadv\fP() と \fBwritev\fP() によるデータ転送は atomic に行われる。つまり、 \fBwritev\fP() によるデータ書き込みは一つのブロックとして行われ、他のプロセスの write による書き込みと混ざり合うことはない (例外に関しては \fBpipe\fP(7) を参照のこと)。同様に、 \fBreadv\fP() はファイルから連続するデータブロックが読み出すことが保証され、 -同じファイル記述 (file description; \fBopen\fP(2) 参照) を参照するファイルディスクリプタを持つ他のスレッドやプロセスが +同じファイル記述 (file description; \fBopen\fP(2) 参照) を参照するファイルディスクリプターを持つ他のスレッドやプロセスが 実行した read 操作の影響を受けることはない。 .SS "preadv() と pwritev()" \fBpreadv\fP() システムコールは \fBreadv\fP() と \fBpreadv\fP(2) の機能を @@ -130,32 +130,52 @@ struct iovec { また、追加で以下のエラーが定義されている: .TP \fBEINVAL\fP -\fIiov_len\fP の合計が \fIssize_t\fP の範囲をオーバーフローした。もしくは、 ベクタ数 \fIiovcnt\fP が 0 -より小さいか許可された最大値よりも大きかった。 +\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 準拠 +.\" 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。 -Linux libc5 では、 \fIiovcnt\fP 引き数の型として \fIsize_t\fP を、 -返り値の型として \fIint\fP を使用していた。 +\fBreadv\fP(), \fBwritev\fP(): 4.4BSD (これらのシステムコールは 4.2BSD で初めて登場した), +POSIX.1\-2001. \fBpreadv\fP(), \fBpwritev\fP(): 非標準だが、最近の BSD にも存在する。 .SH 注意 -.SS "Linux での注意" -POSIX.1\-2001 では、 \fIiov\fP で渡すことができる要素数に上限を設ける実装が認められている。 実装は、 -\fI\fP の \fBIOV_MAX\fP を定義することや、実行時に \fIsysconf(_SC_IOV_MAX)\fP -の返り値経由で、この上限を広告することができる。 Linux では、この仕組みにより広告される上限は 1024 であり、 -この値はカーネルでの上限そのものである。 一方で、glibc のラッパー関数は、その関数の内部で呼ばれるカーネル -システムコールがこの上限を超過して失敗したことを検出すると、 追加の動作をする。 \fBreadv\fP() の場合、ラッパー関数は \fIiov\fP -で指定された全ての要素を格納できる大きさの一時バッファを割り当て、 \fBread\fP(2) を呼び出す際にそのバッファを渡し、 そのバッファのデータを -\fIiov\fP の各要素の \fIiov_base\fP フィールドが指定する場所にコピーしてから、 そのバッファを解放する。 \fBwritev\fP() -のラッパー関数も、同じように一時バッファを使って \fBwrite\fP(2) を呼び出す。 +POSIX.1\-2001 では、 \fIiov\fP で渡すことができる要素数に上限を設ける実装が認められている。 実装はこの上限値を広告することができ、 +\fI\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 バグ -ファイルディスクリプタに対する操作を行う \fBreadv\fP() や \fBwritev\fP() と、 +ファイルディスクリプターに対する操作を行う \fBreadv\fP() や \fBwritev\fP() と、 標準入出力ライブラリの関数をごちゃまぜにして呼ぶのはお薦めしない。 どんな結果になるかは定義されておらず、おそらく期待する結果は 得られないだろう。 @@ -180,6 +200,6 @@ nwritten = writev(STDOUT_FILENO, iov, 2); .SH 関連項目 \fBpread\fP(2), \fBread\fP(2), \fBwrite\fP(2) .SH この文書について -この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.54 の一部 +この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man\-pages/ に書かれている。