WRITE(2)

名称
write, writev, pwrite - 出力の書込み

ライブラリ
libc

書式
<sys/types.h> <sys/uio.h> <unistd.h> ssize_t write(int d, const void *buf, size_t nbytes) ssize_t writev(int d, const struct iovec *iov, int iovcnt) ssize_t pwrite(int d, const void *buf, size_t nbytes, off_t offset)

解説
write() は、 buf が指すバッファから記述子 d が参照するオブジェクトに nbytes のデータを書込もうとします。 writev() は同様の動作をしますが、iov[0], iov[1], ..., iov[iovcnt-1] という iov 配列のメンバが指定する iovcnt バッファから出力データを集めます。 pwrite() は同じ機能を実行しますが、ファイルポインタを修正せずに、 ファイルの特定場所に書込みます。

writev() では、 iovec 構造体が以下のように定義されています。

    struct iovec {
    	char   *iov_base;    /* ベースアドレス */
    	size_t  iov_len;     /* 長さ */
    };

各 iovec エントリは、書込むデータがあるメモリのベースアドレスと領域の長さを指定します。 writev() は、常に領域全体を書込んでから次に進みます。

シーク機能があるオブジェクトでは、 write() は d に関連するポインタが指定する位置で開始します。 lseek(2) を参照してください。 write() から戻ると、ポインタは書込まれたバイト数だけ進みます。

シーク機能がないオブジェクトでは、常に現在位置から書込みます。 このようなオブジェクトに関連するポインタの値は未定義です。

実ユーザがスーパユーザでない場合、 write() は、set-user-ID ビットをファイルでクリアします。 これにより、スーパユーザが所有する書込み可能な set-user-ID ファイルを 「捕えた」ユーザは、システムセキュリティを突破できなくなります。

ソケットのように、フローコントロールの影響を受けるオブジェクトで 非ブロッキング I/O を使用すると、 write() と writev() は、要求したより少ないバイト数を書込むことがあります。 戻り値に注意し、可能な場合にはオペレーションの残りを再度試してください。

戻り値
処理が正常に完了すると、書込まれたバイト数が返されます。 そうでない場合は -1 が返され、エラーを示すためにグローバル変数 errno が設定されます。

エラー
write(), writev(), pwrite() は、以下の場合にエラーとなり、ファイルポインタは変更されずに残ります。

[EBADF]
    d が、書込み用に開かれた有効な記述子ではありません。

[EPIPE]
    プロセスによる読取り用に開かれていないパイプに書込もうとしました。

[EPIPE]
    通信相手のソケットに接続していないタイプ SOCK_STREAM のソケットに書込もうとしました。

[EFBIG]
    プロセスのファイルサイズ制限か最大ファイルサイズを越えたファイルに 書込もうとしました。

[EFAULT]
    iov の一部、またはファイルに書込むデータは、 プロセスに割り当てられたアドレス空間の範囲外を指しています。

[EINVAL]
    d に関連するポインタが負になっています。

[ENOSPC]
    ファイルを含むファイルシステムに、充分なスペースが残っていません。

[EDQUOT]
    ファイルを含むファイルシステムのユーザのディスクブロック割当量が 使い尽くされています。

[EIO]
    ファイルシステムに読み書きしている間に入出力エラーが発生しました。

[EINTR]
    書込みが完了する前にシグナルが割り込みました。

[EAGAIN]
    ファイルは非ブロッキング入出力の印がついた状態で、しかも、 すぐにデータを書込める状態ではありません。

writev() は、以下のエラーを戻すことがあります。

[EDESTADDRREQ]
    connect(2) を使用して書込み先アドレスを設定した UNIX ドメインデータグラムソケットに書込む場合に、書込み先が使用できません。

[EINVAL]
    iovcnt が 0 以下になっているか、 UIO_MAXIOV より、大きくなっています。

[EINVAL]
    iov 配列 iov_len 値の 1 つが負になっています。

[EINVAL]
    iov 配列 iov_len 値の合計が、32 ビット整数をオーバフローしました。

[ENOBUFS]
    ソケットに書き出している時に mbuf のプールを使い尽くしました。

pwrite() 呼び出しは、以下のエラーを戻すことがあります。

[EINVAL]
    指定したファイルオフセットが正しくありません。

[ESPIPE]
    ファイル記述子が、パイプ、ソケット、FIFO に関連しています。

関連項目
fcntl(2), lseek(2), open(2), pipe(2), select(2)

規格
write() 関数呼び出しは、 p1003.1-90 に準拠しています。 writev() 関数と pwrite() 関数は、 xpg4.2 で登場しました。

歴史
pwrite() 関数呼び出しは、 AT&T UNIX で登場しました。 writev() 関数呼び出しは、 4.2BSD で登場しました。 write() 関数呼び出しは、 AT&T UNIX で登場しました。