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),并且读取操作会阻塞。
- EAGAIN 或 EWOULDBLOCK
- 文件描述符 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)