OSDN Git Service

(split) LDP: Update release pages.
[linuxjm/LDP_man-pages.git] / release / man2 / readv.2
1 .\" Copyright (C) 2007, 2010 Michael Kerrisk <mtk.manpages@gmail.com>
2 .\" and Copyright (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de)
3 .\"
4 .\" Permission is granted to make and distribute verbatim copies of this
5 .\" manual provided the copyright notice and this permission notice are
6 .\" preserved on all copies.
7 .\"
8 .\" Permission is granted to copy and distribute modified versions of this
9 .\" manual under the conditions for verbatim copying, provided that the
10 .\" entire resulting derived work is distributed under the terms of a
11 .\" permission notice identical to this one.
12 .\"
13 .\" Since the Linux kernel and libraries are constantly changing, this
14 .\" manual page may be incorrect or out-of-date.  The author(s) assume no
15 .\" responsibility for errors or omissions, or for damages resulting from
16 .\" the use of the information contained herein.  The author(s) may not
17 .\" have taken the same level of care in the production of this manual,
18 .\" which is licensed free of charge, as they might when working
19 .\" professionally.
20 .\"
21 .\" Formatted or processed versions of this manual, if unaccompanied by
22 .\" the source, must acknowledge the copyright and authors of this work.
23 .\" License.
24 .\" Modified Sat Jul 24 18:34:44 1993 by Rik Faith (faith@cs.unc.edu)
25 .\" Merged readv.[23], 2002-10-17, aeb
26 .\" 2007-04-30 mtk, A fairly major rewrite to fix errors and
27 .\"     add more details.
28 .\" 2010-11-16, mtk, Added documentation of preadv() and pwritev()
29 .\"
30 .\"*******************************************************************
31 .\"
32 .\" This file was generated with po4a. Translate the source file.
33 .\"
34 .\"*******************************************************************
35 .TH READV 2 2010\-11\-17 Linux "Linux Programmer's Manual"
36 .SH 名前
37 readv, writev, preadv, pwritev \- 複数のバッファへの読み書きを行なう
38 .SH 書式
39 .nf
40 \fB#include <sys/uio.h>\fP
41 .sp
42 \fBssize_t readv(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB);\fP
43 .sp
44 \fBssize_t writev(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB);\fP
45 .sp
46 \fBssize_t preadv(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB,\fP
47 \fB               off_t \fP\fIoffset\fP\fB);\fP
48 .sp
49 \fBssize_t pwritev(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB,\fP
50 \fB                off_t \fP\fIoffset\fP\fB);\fP
51 .fi
52 .sp
53 .in -4n
54 glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7)  参照):
55 .in
56 .sp
57 \fBpreadv\fP(), \fBpwritev\fP(): _BSD_SOURCE
58 .SH 説明
59 \fBreadv\fP() システムコールは、ファイルディスクリプタ \fIfd\fP に関連付けられた
60 ファイルから、 \fIiovcnt\fP 個のバッファ分のデータを読み込み、 \fIiov\fP で指定
61 されたバッファに格納する ("scatter input";「ばらまき入力」)。
62 .PP
63 \fBwritev\fP() システムコールは、 \fIiov\fP で指定されたバッファから最大 \fIiovcnt\fP
64 個のバッファ分のデータを取り出し、 ファイルディスクリプタ \fIfd\fP に関連付けら
65 れたファイルに書き込む ("gather output";「かき集め出力」)。
66 .PP
67 ポインタ \fIiov\fP は \fIiovec\fP 構造体の配列へのポインタである。 \fIiovec\fP 構造体は \fI<sys/uio.h>\fP
68 で以下のように定義されている:
69 .PP
70 .br
71 .in +4n
72 .nf
73 struct iovec {
74     void  *iov_base;    /* Starting address */
75     size_t iov_len;     /* Number of bytes to transfer */
76 };
77 .fi
78 .in
79 .PP
80 \fBreadv\fP() システムコールは、複数のバッファにデータを読み込む点を除いて
81 \fBread\fP(2) と全く同様の動作を行う。
82 .PP
83 \fBwritev\fP() システムコールは、複数のバッファのデータを書き出す点以外は
84 \fBwrite\fP(2) と全く同様の動作を行う。
85 .PP
86 バッファは配列の順序で処理される。これは、 \fBreadv\fP()  が \fIiov\fP[0] が完全に一杯になるまでデータを詰めてから、
87 \fIiov\fP[1] などに進むことを意味する (データが十分ない場合は、 \fIiov\fP が指すバッファのいずれも一杯にならない)。 同様に、
88 \fBwritev\fP()  は \fIiov\fP[0] の内容を全部書き出してから \fIiov\fP[1] などに進む。
89 .PP
90 \fBreadv\fP()  と \fBwritev\fP()  によるデータ転送は atomic に行われる。つまり、 \fBwritev\fP()
91 によるデータ書き込みは一つのブロックとして行われ、他のプロセスの write による書き込みと混ざり合うことはない (例外に関しては
92 \fBpipe\fP(7)  を参照のこと)。同様に、 \fBreadv\fP()  はファイルから連続するデータブロックが読み出すことが保証され、
93 同じファイル記述 (file description; \fBopen\fP(2)  参照) を参照するファイルディスクリプタを持つ他のスレッドやプロセスが
94 実行した read 操作の影響を受けることはない。
95 .SS "preadv() と pwritev()"
96 \fBpreadv\fP() システムコールは \fBreadv\fP() と \fBpreadv\fP(2) の機能を
97 組み合わせたものである。
98 \fBreadv\fP() と同じ処理を実行するが、
99 4 番目の引き数 \fIoffset\fP が追加されており、
100 この引き数は入力操作を行うファイルオフセットを指定する。
101
102 \fBpwritev\fP() システムコールは \fBwritev\fP() と \fBpwrite\fP(2) の機能を
103 組み合わせたものである。
104 \fBwritev\fP() と同じ処理を実行するが、
105 4 番目の引き数 \fIoffset\fP が追加されており、
106 この引き数は出力操作を行うファイルオフセットを指定する。
107
108 これらのシステムコールで、ファイルオフセットは変更されない。
109 \fIfd\fP が参照するファイルは seek 可能でなければならない。
110 .SH 返り値
111 成功した場合、 \fBreadv\fP() と \fBpreadv\fP は読み込んだバイト数を返し、
112 \fBwritev\fP() と \fBpwritev\fP()は書き込んだバイト数を返す。
113 エラーの場合 \-1 を返し、\fIerrno\fP を適切に設定する。
114 .SH エラー
115 \fBread\fP(2)  や \fBwrite\fP(2)  と同じエラーが定義されている。
116 さらに、 \fBpreadv\fP() と \fBpwritev\fP() は \fBlseek\fP(2) と同じ理由でも失敗する。
117 また、追加で以下のエラーが定義されている:
118 .TP 
119 \fBEINVAL\fP
120 \fIiov_len\fP の合計が \fIssize_t\fP の範囲をオーバーフローした。もしくは、 ベクタ数 \fIiovcnt\fP が 0
121 より小さいか許可された最大値よりも大きかった。
122 .SH バージョン
123 \fBpreadv\fP() と \fBpwritev\fP() は Linux 2.6.30 で初めて登場した。
124 ライブラリによるサポートは glibc 2.10 で追加された。
125 .SH 準拠
126 .\" The readv/writev system calls were buggy before Linux 1.3.40.
127 .\" (Says release.libc.)
128 \fBreadv\fP(), \fBwritev\fP():
129 4.4BSD (これらのシステムコールは 4.2BSD で最初に現われた)、POSIX.1\-2001。
130 Linux libc5 では、 \fIiovcnt\fP 引き数の型として \fIsize_t\fP を、
131 返り値の型として \fIint\fP を使用していた。
132
133 \fBpreadv\fP(), \fBpwritev\fP(): 非標準だが、最近の BSD にも存在する。
134 .SH 注意
135 .SS "Linux での注意"
136 POSIX.1\-2001 では、 \fIiov\fP で渡すことができる要素数に上限を設ける実装が認められている。 実装は、
137 \fI<limits.h>\fP の \fBIOV_MAX\fP を定義することや、実行時に \fIsysconf(_SC_IOV_MAX)\fP
138 の返り値経由で、この上限を広告することができる。 Linux では、この仕組みにより広告される上限は 1024 であり、
139 この値はカーネルでの上限そのものである。 一方で、glibc のラッパー関数は、その関数の内部で呼ばれるカーネル
140 システムコールがこの上限を超過して失敗したことを検出すると、 追加の動作をする。 \fBreadv\fP()  の場合、ラッパー関数は \fIiov\fP
141 で指定された全ての要素を格納できる大きさの一時バッファを割り当て、 \fBread\fP(2)  を呼び出す際にそのバッファを渡し、 そのバッファのデータを
142 \fIiov\fP の各要素の \fIiov_base\fP フィールドが指定する場所にコピーしてから、 そのバッファを解放する。 \fBwritev\fP()
143 のラッパー関数も、同じように一時バッファを使って \fBwrite\fP(2)  を呼び出す。
144 .SH バグ
145 ファイルディスクリプタに対する操作を行う \fBreadv\fP() や \fBwritev\fP() と、
146 標準入出力ライブラリの関数をごちゃまぜにして呼ぶのはお薦めしない。
147 どんな結果になるかは定義されておらず、おそらく期待する結果は
148 得られないだろう。
149 .SH 例
150 以下のサンプルコードは \fBwritev\fP()  の使用方法を示すものである。
151
152 .in +4n
153 .nf
154 char *str0 = "hello ";
155 char *str1 = "world\en";
156 struct iovec iov[2];
157 ssize_t nwritten;
158
159 iov[0].iov_base = str0;
160 iov[0].iov_len = strlen(str0);
161 iov[1].iov_base = str1;
162 iov[1].iov_len = strlen(str1);
163
164 nwritten = writev(STDOUT_FILENO, iov, 2);
165 .fi
166 .in
167 .SH 関連項目
168 \fBpread\fP(2), \fBread\fP(2), \fBwrite\fP(2)
169 .SH この文書について
170 この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.41 の一部
171 である。プロジェクトの説明とバグ報告に関する情報は
172 http://www.kernel.org/doc/man\-pages/ に書かれている。