linux 读取函数read

本文详细解释了read()函数的用法、参数、返回值以及常见错误情况,帮助开发者更好地理解和使用该函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

名字
    read 从一个文件描述符中读取
概要
    #include <unistd.h>
    ssize_t read(int fd, void *buf, size_t count);
描述
    read() 尝试从文件描述符中读取多达count个字节到buf指向的缓冲里面。
    如果count是0,read()返回0并没有其他的结果。如果count比SSIZE_MAX大,则结果未指定
返回值
    成功的话,返回读取的字节数(0意味着文件结束),文件位置要加上这个数。如果这个数比请求的字节数少这也并不是错误;这可能是因为例如实际上当前没有那么多字节可以读取,或者read函数被一个信号中断了。错误的话,返回-1,errno被正确的设置。这种情况下文件的位置是否改变未指定。
错误值
    EAGAIN     文件描述符指向一个socket以外的文件,并被标志为非阻塞,read阻塞了。
    EAGAIN 或者 EWOULDBLOCK
    文件描述符指向socket并标识了非阻塞,read函数阻塞了。
    EBADF fd不是一个有效的描述符或者没有打开
    EFAULT buf超出了可用的地址空间
    EINTR 调用在数据被读之前被信号中断了。
    EINVAL fd附加到了一个不适合读取的对象上;或者文件被以O_DIRECT标志打开了,要不就是指定的缓冲地址/count/当前文件便宜没有恰当的对齐。
    EIO I/O错误。
    EISDIR fd指向了一个目录。
    在NFS文件系统,读取少量的数据将只在第一次更新时间戳,随后的调用可能不会这样做。这是大多数客户端属性缓存引起的,因为不是所有的NFS客户端把st_atime(最后文件的访问时间)更新到服务器,客户端从客户端的缓存完美的读取不会把st_atime更新到取服务器上因为有没有服务器端的读取。 UNIX语义可以获得通过禁用客户端属性缓存,但在大多数情况下,这将大大增加服务器的负载,降低性能。许多文件系统和磁盘被认为是够快以至于O_NONBLOCK的实现被认为是不必要的。因此,O_NONBLOCK可能无法使用在文件和/或磁盘上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值