read(2) - Linux 手册页

名称

read - 从文件描述符读取

概要

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);

描述

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

对于支持 seek 操作的文件,读取操作从当前文件偏移量开始,并且文件偏移量会增加读取的字节数。如果当前文件偏移量位于文件末尾或之后,则不会读取任何字节,并且 read() 返回零。

如果 count 为零,read() 可能 会检测到下面描述的错误。如果没有发生任何错误,或者如果 read() 不检查错误,则具有 count 为 0 的 read() 返回零,并且没有其他影响。

如果 count 大于 SSIZE_MAX,则结果未定义。

返回值

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

错误

EAGAIN
文件描述符 fd 指向一个非套接字文件,并且已被标记为非阻塞 (O_NONBLOCK),并且读取操作会阻塞。
EAGAINEWOULDBLOCK
文件描述符 fd 指向一个套接字,并且已被标记为非阻塞 (O_NONBLOCK),并且读取操作会阻塞。POSIX.1-2001 允许返回这两种错误中的任何一种,并且不要求这些常量具有相同的值,因此可移植的应用程序应检查这两种可能性。
EBADF
fd 不是有效的文件描述符,或者未打开用于读取。
EFAULT
buf 超出了您可访问的地址空间。
EINTR
在读取任何数据之前,调用被信号中断;请参阅 signal(7)
EINVAL
fd 附加到一个不适合读取的对象;或者文件使用 O_DIRECT 标志打开,并且 buf 中指定的地址、count 中指定的值或当前文件偏移量未正确对齐。
EINVAL
fd 通过调用 timerfd_create(2) 创建,并且 read() 接收到的缓冲区大小不正确;有关更多信息,请参阅 timerfd_create(2)
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 语义,但在大多数情况下,这将大大增加服务器负载并降低性能。

参见

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

引用自

aio(7), aio_error(3), aio_read(3), aio_return(3), archive_read(3), cpuset(7), csh(1), dbopen(3), dsp56k(4), epoll(4), epoll(7), epoll_ctl(2), eventfd(2), explain(1), explain(3), explain_lca2010(1), explain_open_or_die(3), explain_read(3), explain_read_or_die(3), fgetln(3), fgets(3), fio(1), fopen(3), getline(3), grep(1), hosts_options(5), htop(1), hylafax-log(5), inotify(7), inotify_add_watch(2), io_canread(3), iostat(1), iv_fd_pump_pump(3), lam_rfposix(2), lamf_rfwrite(2), libarchive(3), libexpect(3), libssh2_sftp_read(3), mkfifo(3), mpool(3), ncl_cgm(3), nfslogsum(8), perf_event_open(2), perfmonctl(2), perlfunc(1), perlpacktut(1), pidfile(3), pipe(2), pipe(7), pipethrough(3), prctl(2), proc(5), pth(3), ptrace(2), readahead(2), readdir(3), recv(2), rmt(8), rtc(4), rtime(3), scrub(1), select_tut(2), sendfile(2), setpgrp(2), sg_dd(8), signalfd(2), socket(2), socket(7), socketpair(2), spew(1), spufs(2), spufs(7), st(4), stat(2), stdin(3), stdio(3), strace(1), tar_append_file(3), tar_block_write(3), tcflush(3), tty_ioctl(4), vpsetcallback(3), vrb(3), vrb_read(3), vrb_read_min(3), wgetch(3), writev(2), x25(7), xdr(3), xfs_io(8), xfsctl(3), zero(4), zvbi-chains(1), zzip_freopen(3)