readv() - ファイルまたはソケットのデータの読み取りとバッファー・セットへの保管

標準

標準/拡張機能 C/C++ 依存項目

XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

X/Open
#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/uio.h>

ssize_t readv(int fs, const struct iovec *iov, int iovcnt);
バークレー・ソケット
#define _OE_SOCKETS
#include <sys/uio.h>

int readv(int fs, struct iovec *iov, int iovcnt);

機能説明

readv() 関数は、記述子 fs のファイルまたはソケットからデータを読み取り、それをバッファー・セットに保管します。データは、iov[0]…iov[iovcnt-1] が指定したバッファーに分散されます。
パラメーター
説明
fs
ファイルまたはソケットの記述子。
iov
iovec 構造体に対するポインター。
iovcnt
iov パラメーターが指すバッファー数。
iovec 構造体は uio.h で定 義されており、以下のフィールドが含まれています。
エレメント
説明
iov_base
バッファーへのポインター。
iov_len
バッファーの長さ。
記述子がソケットを参照している場合には、接続済みのソケットであることが 必要です。

この呼び出しは、iov_len フィールドすべての合計と等しく、それを超えないバイト数のデータを戻します。要求より少ないバイト数しか使用可能でない場合には、この呼び出しは、現在使用可能なバイト数を戻します。ソケット fs のデータが使用できず、さらにソケットがブロック・モードになっている場合には、データが到着するまで、readv() 呼び出しは呼び出し元をブロックします。データが使用できず、さらに fs が非ブロック・モードである場合には、readv() は -1 を戻し、エラー・コードは、EWOULDBLOCK に設定されます。非ブロッキング・モードの設定方法の説明については、fcntl() - オープン・ファイル記述子の制御または ioctl() - 装置の制御を参照してください。

データグラム・ソケットの場合には、このデータグラムの大きさが指定のバッファー に収まるならば、この呼び出しは、送信されたデータグラム全体を戻します。余分なデータグラム・データは廃棄されます。ストリーム・ソケットは、データを分離する境界のない情報ストリームのように動作します。例えば、アプリケーション A および B がストリーム・ソケットと接続され、アプリケーション A が 1000 バイトを送信した場合には、この関数のそれぞれの 呼び出しは、1 バイト、または 10 バイト、あるいは 1000 バイト全体を戻すこと ができます。したがって、ストリーム・ソケットを使用するアプリケーションは、この呼び出しをループに入れて、すべてのデータを受信するまで、この関数を呼び出す必要があります。

X/Open ソケットの場合、読み取るバイト数が 0 のとき、readv() は 0 を戻します。readv() の対象がファイルであり、有効なデータがない場合には、readv() は 0 を戻します。readv() が何らかのデータを読み取る前に、シグナルによって割り込まれた場合には、EINTR に設定された errno と共に -1 を戻します。readv() がデータを読み取った後に、シグナルによって割り込まれた場合には、読み取ったバイト数を戻します。fs がソケットを指している場合には、readv() は、フラグが設定されていない recv() と同等です。

C++ の特殊な動作: この関数を C++ で使用するには、_XOPEN_SOURCE_EXTENDED 1 フィーチャー・テスト・マクロを使用する必要があります。

戻り値

正常に実行された場合、readv() はバッファー中に読み取られたバイト数を戻します。

ストリーム・ソケットでの接続は失敗したが、データは使用できる場合には、readv() 関数は、データを読み取り、エラーになりません。ストリーム・ソケットでの接続は失敗したが、データが使用できない場合には、readv() 関数は、EOF として 0 バイトを戻します。

正常に実行されなかった場合、readv() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EAGAIN
O_NONBLOCK フラグは、ファイル記述子用に設定され、このプロセスは readv() によって遅れることになります。
EBADF
fs が、有効なファイルまたはソケット記述子ではあり ません。
ECONNRESET
接続はピアによって強制的にクローズされました。
EFAULT
iov および iovcnt を使用すると、呼び出し元のアドレス・スペースの外側のストレージへのアクセスを試みる結果になります。
EINTR
readv() は、データが使用可能になる前にキャッチされたシグナル によって割り込まれました。
EINVAL
iovcnt が無効だったか、あるいは iov 配列のフィールド の 1 つが無効でした。
ENOBUFS
使用可能なシステム・リソースが不十分で、呼び出しを完了させることができません。
ENOTCONN
接続されていない接続指向ソケットに対する受信を試みています。
ETIMEDOUT
接続の設定中またはアクティブな接続での伝送のタイムアウトのために、接続がタイムアウトになりました。
EWOULDBLOCK
socket は、非ブロック・モードになっているため、データの読み取りはできません。または、SO_RCVTIMEO タイムアウト 値に達したためデータを使用できませんでした。