名字
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可能无法使用在文件和/或磁盘上。
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可能无法使用在文件和/或磁盘上。