READ(2) | Linux Programmer's Manual | READ(2) |
名前
read -ファイルディスクリプタから読み込む書式
#include <unistd.h>
ssize_t read(int fd , void * buf , size_t count );
説明
read() はファイルディスクリプタ (file descriptor) fd から最大 count バイトを buf で始まるバッファーへ読み込もうとする。返り値
成功した場合、読み込んだバイト数を返す (0 はファイルの終りを意味する)。ファイル位置はこの数だけ進められる。この数が要求した数より小さかったとしてもエラーではない;例えば今すぐには実際にそれだけの数しかない場合 (ファイルの最後に近いのかもしれないし、パイプ (pipe) や端末 (terminal) から読み込んでいるかもしれない) や read() がシグナル (signal) によって割り込まれた場合にこれは起こりえる。エラーの場合は、-1 が返され、 errno が適切に設定される。この場合はファイル位置が変更されるかどうかは不定である。エラー
- EAGAIN
- ファイルディスクリプタ fd がソケット以外のファイルを参照していて、非停止 (nonblocking) モード ( O_NONBLOCK) に設定されており、読み込みを行うと停止する状況にある。
- EAGAIN または EWOULDBLOCK
- ファイルディスクリプタ fd がソケットを参照していて、非停止 (nonblocking) モード ( O_NONBLOCK) に設定されており、読み込みを行うと停止する状況にある。 POSIX.1-2001 は、この場合にどちらのエラーを返すことも認めており、これら 2 つの定数が同じ値を持つことも求めていない。したがって、移植性が必要なアプリケーションでは、両方の可能性を確認すべきである。
- EBADF
- fd が有効なファイルディスクリプタでないか、読み込みのためにオープン (open) されていない。
- EFAULT
- buf がアクセス可能なアドレス空間の外にある。
- EINTR
- 何のデータも読み込まないうちにシグナルに割り込まれた。 signal(7) 参照。
- EINVAL
- fd は読み込みに適していないオブジェクトを参照している。もしくは、ファイルが O_DIRECT フラグを指定してオープンされているが、 buf に指定されたアドレス、 count に指定された値、現在のファイルオフセットのいずれかのアラインメントが不適切である。
- EINVAL
- fd が timerfd_create(2) の呼び出しで作成されたが、 read() に間違ったサイズのバッファが渡された。さらなる情報は timerfd_create(2) を参照のこと。
- EIO
- I/O エラー。これは例えばプロセスがバックグランド・プロセスグループで、それを制御している端末から読み込もうとし、 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 の方式では、クライアント側の属性のキャッシングを無効にすることで、これを得ることができる。しかしほとんどの状況ではこれは続くサーバーの負荷を増加させ、パフォーマンスの低下をもたらす。関連項目
close(2), fcntl(2), ioctl(2), lseek(2), open(2), pread(2), readdir(2), readlink(2), readv(2), select(2), write(2), fread(3)この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2013-02-12 | Linux |