使用以下函数签名
ssize_t read(int fd, void *buf, size_t count);
虽然我确实根据手册页了解,在成功案例中,返回值可能小于count,但返回值是否可以在任何情况下超过count?
Ste*_*itt 18
调用read()
可能会导致在后台读取的数据多于请求的数据(例如,从存储中读取一个完整的块,或提前读取后面的块),但read()
它本身永远不会返回比请求更多的数据 ( count
)。如果是这样,结果很可能是缓冲区溢出,因为buf
通常仅针对count
字节进行大小调整。
POSIX(见上面的链接)明确指定了这个限制:
成功完成后,当nbyte大于 0 时,read()将标记更新文件的最后一个数据访问时间戳,并返回读取的字节数。这个数字永远不会大于nbyte。
Linux 手册页不是很明确,但它确实说
read()
试图读取到计数字节从文件描述符FD 到缓冲开始BUF。
(加了重点。)