名前


write - ファイル・ディスクリプタ (file descriptor) に書き込む

書式


#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

説明


write() は buf で示されるバッファから最大 count バイトまでをファイル・ディスクリプタ fd によって参照されるファイルへと書き込む。 POSIX は write() が行なわれた後に実行した read(2) が 新しいデータを返すことを要求している。 全てのファイル・システム (file system) が POSIX 準拠ではない点に注意すること。

返り値


成功した場合、書き込まれたバイト数が返される (ゼロは何も書き込まれなかったことを示す)。 エラーならば -1 が返され、errno が適切に設定される。

count が 0 で、 fd が通常のファイル (regular file) を参照している場合、 write() は後述のエラーのいずれかを検出した場合、失敗を返すことがある。 エラーが検出されなかった場合は、 0 を返し、他に何の影響も与えない。 count が 0 で、 fd が通常のファイル以外のファイルを参照している場合、 その結果は規定されていない。

エラー


EAGAIN O_NONBLOCK を使用して非停止 (non-blocking) I/O が選択されているが、 書き込みが禁止 (block) された。
EBADF fd が有効なファイル・ディスクリプタでないか書き込みのためにオープン (open) されていない。
EFAULT buf がアクセス可能なアドレス空間 (address space) の外にある。
EFBIG 実装定義の最大ファイルサイズまたはプロセスのファイルサイズ制限を 超えてファイルに書き込もうとした。 または許可されたオフセット値の限界を超えた先の位置に 書き込もうとした。
EINTR 何のデータも書かない間にシグナルによって割り込まれた (interrupt)。
EINVAL fd が書き込みが不適切なオブジェクトを参照している。 もしくは、ファイルが O_DIRECT フラグを指定してオープンされているが、 buf に指定されたアドレス、 count に指定された値、 現在のファイルオフセットのいずれかの アラインメントが不適切である。
EIO inode の修正中に低レべル (low-level) I/O エラーが発生した。
ENOSPC fd によって参照されるファイルを含むデバイス (device) に十分な空きがない。
EPIPE fd がパイプ (pipe) かソケット (socket) に接続されており、 その反対側 (読み込み側) がクローズ (close) されている。 これが発生した場合には、書き込みを行なうプロセスは SIGPIPE シグナル (signal)も受ける。 (したがって、プログラムがこのシグナルを捕獲 (catch)、禁止 (block)、無視 (ignore) した場合のみ、write の返り値を参照できる)
fd に接続されたオブジェクトによっては、他のエラーが起こるかもしれない。

準拠


SVr4, 4.3BSD, POSIX.1-2001.

SVr4 では write が割り込まれると、データが書き込まれる直前ではなく、 その時点で EINTR が返る。

注意


write() が成功して返ってきても、データがディスクに記録されたことを 保証するものではない。 実際、データのためのスペースが確保されたことすら保証されないという バグっぽい実装もある。 これを確実にする唯一の方法は、 全てのデータを write した後に fsync(2) を呼び出すことである。

関連項目


close(2), fcntl(2), fsync(2), ioctl(2), lseek(2), open(2), pwrite(2), read(2), select(2), writev(2), fwrite(3)

openSUSE Logo

コンテンツ