readv() - ファイルまたはソケットのデータの読み取りとバッファー・セットへの保管
標準
標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
XPG4.2 |
両方 |
形式
#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);
機能説明
- パラメーター
- 説明
- fs
- ファイルまたはソケットの記述子。
- iov
- iovec 構造体に対するポインター。
- iovcnt
- iov パラメーターが指すバッファー数。
- エレメント
- 説明
- 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 バイトを戻します。
- エラー・コード
- 説明
- EAGAIN
- O_NONBLOCK フラグは、ファイル記述子用に設定され、このプロセスは readv() によって遅れることになります。
- EBADF
- fs が、有効なファイルまたはソケット記述子ではあり ません。
- ECONNRESET
- 接続はピアによって強制的にクローズされました。
- EFAULT
- iov および iovcnt を使用すると、呼び出し元のアドレス・スペースの外側のストレージへのアクセスを試みる結果になります。
- EINTR
- readv() は、データが使用可能になる前にキャッチされたシグナル によって割り込まれました。
- EINVAL
- iovcnt が無効だったか、あるいは iov 配列のフィールド の 1 つが無効でした。
- ENOBUFS
- 使用可能なシステム・リソースが不十分で、呼び出しを完了させることができません。
- ENOTCONN
- 接続されていない接続指向ソケットに対する受信を試みています。
- ETIMEDOUT
- 接続の設定中またはアクティブな接続での伝送のタイムアウトのために、接続がタイムアウトになりました。
- EWOULDBLOCK
- socket は、非ブロック・モードになっているため、データの読み取りはできません。または、SO_RCVTIMEO タイムアウト 値に達したためデータを使用できませんでした。
関連情報
- sys/uio.h — ベクトル入出力操作
- connect() - ソケットの接続
- fcntl() - オープン・ファイル記述子の制御
- getsockopt() - ソケットに関連したオプションの取得
- ioctl() - 装置の制御
- read() - ファイルまたはソケットからの読み取り
- recv() - ソケット上のデータの受信
- recvfrom() - ソケット上のメッセージの受信
- recvmsg() - ソケット上のメッセージの受信およびメッセージ・ヘッダーの配列への保管
- select()、pselect() - ファイルまたはソケットおよびメッセージ・キューに関するアクティビティーのモニター
- selectex() - ファイルまたはソケットおよびメッセージ・キューに関するアクティビティーのモニター
- send() - ソケットに関するデータの送信
- sendmsg() - ソケットに関するメッセージの送信
- sendto() - ソケットに関するデータの送信
- setsockopt() - ソケットに関連したオプションの設定
- socket() - ソケットの作成
- write() - ファイルまたはソケットへのデータの書き込み
- writev() - 配列からファイルまたはソケットへのデータの書き込み