1. read系统调用
read - 在文件描述符上执行读操作
1.1. 概述
read(9, "\"\\\"\\\\\\\\\\\\\\\"\\"..., 16384) = 344
ssize_t read(int fd,void *buf,size_t count)
1.2. 描述
从文件描述符fd中读取count字节的数据并放入从buf开始的缓冲区中. 如果 count 为零,read()返回0,不执行其他任何操作. 如果 count 大于SSIZE_MAX,那么结果将不可预料.
1.3. 返回值
- 如果读取成功,则返回实际读到的字节数。这里又有两种情况:一是如果在读完count要求字节之前已经到达文件的末尾,那么实际返回的字节数将小于count值,但是仍然大于0;二是在读完count要求字节之前,仍然没有到达文件的末尾,这是实际返回的字节数等于要求的count值。
- 如果读取时已经到达文件的末尾,则返回0。
- 发生错误时返回-1,并置 errno 为相应值.在这种情况下无法得知文件偏移位置是否有变化.
1.4. 错误代码
EINTR : 在读取到数据以前调用被信号所中断. EAGAIN : 使用O_NONBLOCK标志指定了非阻塞式输入输出,但当前没有数据可读. EIO : 输入输出错误.可能是正处于后台进程组进程试图读取其 控制终端,但读操作无效,或者被信号SIGTTIN所阻塞, 或者其进程组是孤儿进程组.也可能执行的是读磁盘或者 磁带机这样的底层输入输出错误. EISDIR : fd 指向一个目录. EBADF : fd 不是一个合法的文件描述符,或者不是为读操作而打开. EINVAL : fd 所连接的对象不可读. EFAULT : buf 超出用户可访问的地址空间. 也可能发生其他错误,具体情况和 fd 所连接的对象有关. POSIX 允许 read 在读取了一定量的数据后被信号所中断,并返回 -1(且 errno 被设置为EINTR),或者返回已读取的数据量.
1.5. 兼容于
SVr4, SVID, AT&T, POSIX, X/OPEN, BSD 4.3
1.6. 限制
在NFS文件系统中,读取小块数据仅更新时间标记,之后的调用不再读取服务器端的数据.这是因为客户端把数据放在缓存里. 由于大多数情况下不存在NFS服务器向客户端的读操作, 所以NFS客户必须将更新时间标记的操作放在服务器端,而 数据可以放在客户端的缓存里留待以后更新.UNIX也可以禁用客户端的缓存,但那样的话大多数情况下会导致服务器性能下降.
1.7. 参见
close(2), fcntl(2), ioctl(2), lseek(2), readdir(2), readlink(2), select(2), write(2), fread(3)