writev() - 配列からファイルまたはソケットへのデータの書き込み

標準

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

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

両方  

形式

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

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

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

機能説明

writev() 関数は、一組のバッファーから、記述子 fs をもつファイルまたはソケットに、データを書き込みます。データは、iov[0]…iov[iovcnt-1] が指定したバッファーから収集されます。記述子がソケットを指しているときには、これは接続ソケットで なければなりません。
パラメーター
説明
fs
ファイルまたはソケットの記述子。
iov
iovec バッファーの配列を指すポインター。
iovcnt
iov パラメーターが指すバッファー数。
iovec 構造体は uio.h で定 義されており、以下のフィールドが含まれています。
エレメント
説明
iov_base
バッファーを指すポインター。
iov_len
バッファーの長さ。

この呼び出しは、データの iov_len バイトの合計を 書き込みます。

送信するソケット・データを保留するのに使用可能なバッファー・スペースが十分でなく、ソケットがブロック・モードになっている場合には、writev() は、追加のバッファー・スペースが使用可能になるまで呼び出し元をブロックします。ソケットが非ブロック・モードになっている場合には、writev() は -1 を戻し、エラー・コードを EWOULDBLOCK に設定します。非ブロッキング・モードの設定方法の説明については、fcntl() - オープン・ファイル記述子の制御または ioctl() - 装置の制御を参照してください。

ソケットでデータの受け入れが可能になっていなく、プロセスが データをソケットに書き込もうとしているときには、次のとおり になります。
  • FNDELAY または O_NONBLOCK が設定されていない限り、writev() は、ソケットでデータの受け入れが可能になるまでブロックします。
  • FNDELAY が設定されると、writev() は 0 を戻します。
  • O_NONBLOCK を設定すると、writev() はプロセスをブロックしません。プロセスをブロックしないで一部のデータを書き込める場合には、writev() は、書き込めるものを書き込み、書き込まれたバイト数を戻します。そうでない場合には、writev() は、エラー・コードを EAGAIN に設定し、-1 を戻します。

データグラム・ソケットの場合、データグラムが TCP/IP バッファーに適合すれば、この呼び出しはデータグラム全体を送信します。ストリーム・ソケットは、データを分離する境界のない情報ストリームのように動作します。例えば、アプリケーション・プログラムが 1000 バイトを送信したい場合 には、この関数を呼び出すたびに 1 バイトまたは 10 バイト あるいは 1000 バイト全部を送信できます。したがって、ストリーム・ソケットを使用するアプリケーション・プログラムは この呼び出しをループに配置して、すべてのデータが送信されるまで この関数を呼び出す必要があります。

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

戻り値

正常に実行された場合、writev() は、バッファーから書き込まれたバイト数を戻します。

0 またはそれより大きい値は、送信されたバイト数を示していますが、これはデータの送達が完了したことを保証するわけではありません。データの送達が完了していない場合は、ピア・ソケットおよびあとで生成された SIGPIPE シグナルを使って接続を終了することができます。

正常に実行されなかった場合、writev() は、-1 を戻して、errno を次のいずれかの値に設定します。
エラー・コード
説明
EAGAIN
リソースは一時的に使用できません。以降の要求は正常に 完了できます。
EBADF
fs が、有効なファイルまたはソケット記述子ではあり ません。
ECONNRESET
接続はピアによって強制的にクローズされました。
EDESTADDRREQ
ソケットは接続目的でないため、ピア・アドレスは設定されません。
EFAULT
iov および iovcnt パラメーターを使用すると、呼び出し元のアドレス・スペースの外側のストレージにアクセスすることになります。
EINTR
データが送信される前に、シグナルが writev() に割り込みました。
EINVAL
iocvnt の正しくない値が検出されました。
EMSGSIZE
メッセージが大きすぎて、1 つのデータグラムとして送信されませんでした。
ENOBUFS
メッセージの送信にバッファー・スペースを使用することができません。
ENOTCONN
ソケットが接続していません。
EPIPE
接続されたストリーム・ソケットの場合には、ピア・ソケット との接続が失われています。SIGPIPE シグナルが呼び出しプロセスに送信されます。
EPROTOTYPE
プロトコルのタイプが、このソケットには適切ではありません。SIGPIPE シグナルが呼び出しプロセスに送信されます。
EWOULDBLOCK
socket は非ブロック・モードであり、使用可能なデータ・バッファーがないか、バッファーが使用可能になる前に SO_SNDTIMEO タイムアウト値に達しました。

関連情報