read() - Unix、Linux 系统调用
Tutorials Point


  Unix 初学者指南
  Unix Shell 编程
  高级 Unix
  Unix 有用参考
  Unix 有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考     讨论论坛     关于 TP  

read() - Unix、Linux 系统调用


previous next AddThis Social Bookmark Button

广告

名称

read - 从文件描述符读取

语法

#include <unistd.h> 

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

描述

read() 尝试从文件描述符 fd 读取最多 count 个字节到以 buf 开头的缓冲区中。

如果 count 为零,read() 返回零且没有其他结果。如果 count 大于 SSIZE_MAX,则结果未定义。

返回值

成功时,返回读取的字节数(零表示文件结束),文件位置将向前移动此数量。如果此数字小于请求的字节数,则不视为错误;例如,这可能发生是因为现在实际可用的字节数较少(可能是因为我们接近文件末尾,或者因为我们正在从管道或终端读取),或者因为 read() 被信号中断。出错时,返回 -1,并适当地设置 errno。在这种情况下,文件位置(如果有)是否更改是未指定的。

错误

标签描述
EAGAIN 使用 O_NONBLOCK 选择了非阻塞 I/O,并且没有立即可用于读取的数据。
EBADF fd 不是有效的文件描述符,或者未打开以供读取。
EFAULT buf 位于您可访问的地址空间之外。
EINTR 在读取任何数据之前,调用被信号中断。
EINVAL fd 附加到不适合读取的对象;或者文件以 O_DIRECT 标志打开,并且 buf 中指定的地址、count 中指定的值或当前文件偏移量未正确对齐。
EIO I/O 错误。例如,当进程位于后台进程组中,尝试从其控制终端读取,并且它正在忽略或阻止 SIGTTIN 或其进程组已成为孤儿时,将发生这种情况。当从磁盘或磁带读取时出现低级 I/O 错误时,也可能发生这种情况。
EISDIR fd 指向一个目录。
可能会发生其他错误,具体取决于连接到 fd 的对象。POSIX 允许在读取一些数据后被中断的 read() 返回 -1(将 errno 设置为 EINTR)或返回已读取的字节数。

符合标准

SVr4、4.3BSD、POSIX.1-2001。

限制

在 NFS 文件系统上,读取少量数据只会第一次更新时间戳,后续调用可能不会这样做。这是由客户端属性缓存引起的,因为大多数(如果不是全部)NFS 客户端将 st_atime(上次文件访问时间)更新留给服务器,并且从客户端缓存中满足的客户端读取不会导致服务器上的 st_atime 更新,因为没有服务器端读取。可以通过禁用客户端属性缓存来获得 UNIX 语义,但在大多数情况下,这会大大增加服务器负载并降低性能。

许多文件系统和磁盘被认为足够快,因此 O_NONBLOCK 的实现被认为是不必要的。因此,O_NONBLOCK 可能在文件和/或磁盘上不可用。

参见



previous next Printer Friendly

广告


  

广告



广告