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)

Copyright © 温玉 2021 | 浙ICP备2020032454号 all right reserved,powered by Gitbook该文件修订时间: 2023-06-19 08:59:50

results matching ""

    No results matching ""