名前


read - ファイル・ディスクリプターから読み込む

書式


#include <unistd.h>

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

説明


read() はファイル・ディスクリプター (file descriptor) fd から最大 count バイトを buf で始まるバッファーへ読み込もうとする。

count が 0 ならば、 read() は 0 を返し、他に何も起きない。 count が SSIZE_MAX より大きければ、結果は特定できない。

返り値


成功した場合、読み込んだバイト数を返す (0 はファイルの終りを意味する)。 ファイル位置はこの数だけ進められる。 この数が要求した数より小さかったとしてもエラーではない; 例えば今すぐには実際にそれだけの数しかない場合 (ファイルの最後に近いのかも しれないし、パイプ (pipe) や端末 (terminal) から読み込んでいるかもしれない) や read() がシグナル (signal) によって割り込まれた場合にこれは起こりえる。 エラーの場合は、-1 が返され、 errno が適切に設定される。この場合はファイル位置が変更されるかどうかは 不定である。

エラー


EAGAIN O_NONBLOCK を使用して非停止 (Non-blocking) I/O が選択されており、 すぐにデータが読み込み可能でなかった。
EBADF fd が有効なファイル・ディスクリプターでないか、読み込みのために オープン (open) されていない。
EFAULT buf がアクセス可能なアドレス空間の外にある。
EINTR 何のデータも読み込まないうちにシグナルに割り込まれた。
EINVAL fd は読み込みに適していないオブジェクトを参照している。 もしくは、ファイルが O_DIRECT フラグを指定してオープンされているが、 buf に指定されたアドレス、 count に指定された値、 現在のファイルオフセットのいずれかの アラインメントが不適切である。
EIO I/O エラー。これは例えばプロセスがバックグランド・プロセス・グループで、 それを制御している tty から読み込もうとし、SIGTTIN が無視 (ignore) または 禁止 (blocking) されている場合や、そのプロセス・グループが孤立 (orphan) して いる場合に起こる。またディスクやテープを読んでいる時に低レベル I/O エラー が発生した場合にも起こる。
EISDIR fd がディレクトリを参照している。
fd が接続しているオブジェクトによっては他のエラーも起こりえる。 POSIX では、 いくらかのデータを読んだ後に割り込みが起こった場合、 read() は (errno に EINTR を設定して) -1 を返してもよいし、 既に読み込んだバイト数を返してもよい。

準拠


SVr4, 4.3BSD, POSIX.1-2001.

注意


NFS において。少量のデータを読み込む場合、最初の時のみにタイム・ スタンプが更新され、続くコールでは更新されないだろう。 これはクライアント側で属性のキャッシングを行なうためである。 なぜならば、もし全ての NFS クライアントが st_atime (最終ファイルアクセス時刻) の更新をサーバーに送らず、クライアント側でキャッシュを読むことに満足して いれば、サーバー側での read は発生しないので st_atime の更新は行なわれからだ。 UNIX の方式では、クライアント側の属性のキャッシングを無効にすることで、 これを得ることができる。しかしほとんどの状況ではこれは続くサーバーの 負荷を増加させ、パフォーマンスの低下をもたらす。

多くのファイルシステムやディスクは O_NONBLOCK の実装はしなくても済むくらいに十分に高速であると考えられている。 それでそのようなファイルやディスクには O_NONBLOCK は 利用できないかもしれない。

関連項目


close(2), fcntl(2), ioctl(2), lseek(2), open(2), pread(2), readdir(2), readlink(2), readv(2), select(2), write(2), fread(3)

openSUSE Logo

コンテンツ