READ
Section: Linux Programmer's Manual (2)
Updated: July 12, 1997
Index
NAME
read - 在文件描述符上执行读操作
概述
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
描述
read()
从文件描述符
fd
中读取
count
字节的数据并放入从
buf
开始的缓冲区中.
如果
count
为零,read()返回0,不执行其他任何操作.
如果
count
大于SSIZE_MAX,那么结果将不可预料.
返回值
成功时返回读取到的字节数(为零表示读到文件描述符),
此返回值受文件剩余字节数限制.当返回值小于指定的字节数时
并不意味着错误;这可能是因为当前可读取的字节数小于指定的
字节数(比如已经接近文件结尾,或者正在从管道或者终端读取数
据,或者
read()被信号中断).
发生错误时返回-1,并置
errno
为相应值.在这种情况下无法得知文件偏移位置是否有变化.
错误代码
- EINTR
-
在读取到数据以前调用被信号所中断.
- EAGAIN
-
使用
O_NONBLOCK
标志指定了非阻塞式输入输出,但当前没有数据可读.
- EIO
-
输入输出错误.可能是正处于后台进程组进程试图读取其
控制终端,但读操作无效,或者被信号SIGTTIN所阻塞,
或者其进程组是孤儿进程组.也可能执行的是读磁盘或者
磁带机这样的底层输入输出错误.
- EISDIR
-
fd
指向一个目录.
- EBADF
-
fd
不是一个合法的文件描述符,或者不是为读操作而打开.
- EINVAL
-
fd
所连接的对象不可读.
- EFAULT
-
buf
超出用户可访问的地址空间.
也可能发生其他错误,具体情况和
fd
所连接的对象有关.
POSIX 允许
read
在读取了一定量的数据后被信号所中断,并返回
-1(且
errno
被设置为EINTR),或者返回已读取的数据量.
兼容于
SVr4, SVID, AT&T, POSIX, X/OPEN, BSD 4.3
限制
在NFS文件系统中,读取小块数据仅更新时间标记,之后的调用
不再读取服务器端的数据.这是因为客户端把数据放在缓存里.
由于大多数情况下不存在NFS服务器向客户端的读操作,
所以NFS客户必须将更新时间标记的操作放在服务器端,而
数据可以放在客户端的缓存里留待以后更新.UNIX也可以禁用
客户端的缓存,但那样的话大多数情况下会导致服务器性能下降.