標準
標準/拡張機能 |
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 タイムアウト値に達しました。