WRITE
Section: Linux Programmer's Manual (2)
Updated: 2007-06-18
Index
JM Home Page
roff page
名前
write - ファイル・ディスクリプタ (file descriptor) に書き込む
書式
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
説明
write()
は、
buf
が指すバッファから、ファイル・ディスクリプタ
fd
が参照するファイルへ、最大
count
バイトを書き込む。
書き込まれるバイト数は
count
よりも小さくなることがある。
例えば、書き込み対象の物理メディアに十分な領域がない場合、
リソース上限
RLIMIT_FSIZE
に達した場合
(setrlimit(2)
参照)、
count
バイト未満の書き込みが行われた後で
呼び出しがシグナルハンドラにより割り込まれた場合、
などである。
(pipe(7)
も参照のこと。)
seek 可能なファイル (つまり
lseek(2)
が適用できるファイル、例えば通常のファイル) では、
書き込みは現在のファイル・オフセットから行われ、
ファイル・オフセットは実際に書き込みが行われたバイト数分
加算される。ファイルが
O_APPEND
で
open(2)
された場合、ファイル・オフセットは書き込み前に
ファイルの末尾に設定される。
ファイル・オフセットの調整と書き込み操作はアトミックな処理として
実行される。
POSIX は
write()
が行なわれた後に実行した
read(2)
が
新しいデータを返すことを要求している。
全てのファイル・システムが POSIX 準拠ではない点に注意すること。
返り値
成功した場合、書き込まれたバイト数が返される
(ゼロは何も書き込まれなかったことを示す)。
エラーならば -1 が返され、errno が適切に設定される。
count が 0 で、
fd
が通常のファイル (regular file) を参照している場合、
write()
は後述のエラーのいずれかを検出した場合、失敗を返すことがある。
エラーが検出されなかった場合は、
0 を返し、他に何の影響も与えない。
count が 0 で、
fd
が通常のファイル以外のファイルを参照している場合、
その結果は規定されていない。
エラー
- EAGAIN
-
ファイルディスクリプタ
fd
が非停止モード
(O_NONBLOCK)
に設定されていて、
書き込みが停止 (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)
を呼び出すことである。
write()
が 1 バイトも書き込まないうちにシグナルハンドラにより割り込まれた場合、
write()
はエラー
EINTR
で失敗する。
1バイトでも書き込んだ後で割り込まれた場合には、
write()
は成功し、書き込んだバイト数を返す。
関連項目
close(2),
fcntl(2),
fsync(2),
ioctl(2),
lseek(2),
open(2),
pwrite(2),
read(2),
select(2),
writev(2),
fwrite(3)
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- エラー
-
- 準拠
-
- 注意
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 04:32:12 GMT, November 19, 2007