READ - Linux手册页

时间:2019-08-20 17:59:12  来源:igfitidea点击:

Linux程序员手册 第2部分
更新日期: 2018-02-02

名称

read-从文件描述符读取

语法

#include <unistd.h>

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

说明

read()尝试从文件描述符fd读取最多计数的字节到缓冲区(从buf开始)。

在支持查找的文件上,读取操作从文件偏移量开始,并且文件偏移量以读取的字节数递增。如果文件偏移量等于或大于文件末尾,则不会读取任何字节,并且read()返回零。

如果count为零,则read()可能会检测到以下错误。在没有任何错误的情况下,或者如果read()不检查错误,则计数为0的read()返回零,并且没有其他影响。

根据POSIX.1,如果count大于SSIZE_MAX,则结果是实现定义的;有关Linux上的上限,请参见注释。

返回值

成功后,将返回读取的字节数(零表示文件末尾),并且文件位置以该数字前移。如果此数目小于请求的字节数,这不是错误;例如,这可能是因为当前实际可用的字节较少(可能是因为我们接近文件末尾,或者因为我们正在从管道或终端读取),或者因为read()被a中断了。信号。另请参阅注释。

如果出错,则返回-1,并正确设置errno。在这种情况下,未指定文件位置(如果有)是否更改。

错误说明

EAGAIN
文件描述符fd引用了套接字以外的文件,并被标记为非阻塞(O_NONBLOCK),并且读取将阻塞。有关O_NONBLOCK标志的更多详细信息,请参见open(2)。
EAGAINor EWOULDBLOCK
文件描述符fd引用了一个套接字,并被标记为非阻塞(O_NONBLOCK),并且读取将阻塞。 POSIX.1-2001允许在这种情况下返回任何一个错误,并且不需要这些常量具有相同的值,因此可移植应用程序应检查这两种可能性。
EBADF
fd不是有效的文件描述符,或者未打开以供读取。
EFAULT
buf在您可访问的地址空间之外。
EINTR
在读取任何数据之前,该呼叫已被信号中断。参见signal(7)。
EINVAL
fd附着在不适合阅读的物体上;或使用O_DIRECT标志打开了文件,并且buf中指定的地址,count中指定的值或文件偏移未正确对齐。
EINVAL
通过调用timerfd_create(2)创建了fd,并且为read()提供了错误的大小缓冲区;有关更多信息,请参见timerfd_create(2)。
EIO
I / O错误。例如,当进程在后台进程组中,尝试从其控制终端读取数据,而忽略或阻止SIGTTIN或孤立其进程组时,就会发生这种情况。当从磁盘或磁带读取时发生低级I / O错误时,也可能会发生这种情况。联网文件系统上EIO的另一个可能原因是,在文件描述符上取消了咨询性锁定后,该锁定已丢失。有关更多详细信息,请参见fcntl(2)的"丢失的锁"部分。
EISDIR
fd指目录。

取决于连接到fd的对象,可能还会发生其他错误。

遵循规范

SVr4、4.3BSD,POSIX.1-2001。

备注

size_t和ssize_t类型分别是POSIX.1指定的无符号和有符号整数数据类型。

在Linux上,read()(和类似的系统调用)将最多传输0x7ffff000(2,147,479,552)字节,并返回实际传输的字节数。 (在32位和64位系统上都是如此。)

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

BUGS

根据POSIX.1-2008 / SUSv4第XSI 2.9.7节("与常规文件操作的线程交互"):

当它们对常规文件或符号链接进行操作时,以下所有功能在POSIX.1-2008中指定的效果中,彼此之间都是原子的:...

随后列出的API中有read()和readv(2)。在线程(和进程)之间应该具有原子性的影响包括文件偏移量的更新。但是,在版本3.14之前的Linux上,情况并非如此:如果两个共享打开文件描述的进程(请参阅open(2))同时执行read()(或readv(2)),则I / O操作不是更新文件偏移量的原子操作,其结果是两个进程中的读取可能(错误地)重叠在它们获取的数据块中。此问题已在Linux 3.14中修复。

另外参见

close(2),fcntl(2),ioctl(2),lseek(2),open(2),pread(2),readdir(2),readlink(2),readv(2),select(2), write(2),fread(3)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/