标准的unix C语言有这个函数:
但是,这个“read”函数一次可以读取的最大字节数是多少?
ssize_t read(int fd, void *buf, size_t count);
但是,这个“read”函数一次可以读取的最大字节数是多少?
来自man read(2)
:
read()
试图从文件描述符fd中读取最多count个字节,并将其存储到buf指向的缓冲区中。如果count为零,
read()
返回零并且没有其他结果。如果count大于SSIZE_MAX
,则结果未指定。
SSIZE_MAX
的值取决于您的系统,但通常类似于signed long
的最大值,这通常是231(32位系统)或263(64位系统)。
231个字节是2 GB,因此您可能是安全的。实际上,设备驱动程序/缓冲区/网络I/O永远不会一次性给您提供一个2 GB的数据块。
引用自IEEE标准1003.1(也称为POSIX.1)
如果nbyte的值大于{SSIZE_MAX},则结果由实现定义。
因此,您需要在目标平台上检查man 2 read
。例如,FreeBSD手册在错误部分中说:
[EINVAL] nbytes的值大于INT_MAX。
buf
中可用的字节数相同的字节。实际上,底层设备驱动程序(无论是文件系统、网络还是管道)如果没有更多可用的内容,则会返回少于您所需的内容。read
的特定行为取决于内核中底层驱动程序的实现。read
的返回值并检查实际读取的字节数非常重要。它可以读取缓冲区所能容纳的最大值,限制为SSIZE_MAX以及硬件的限制。
SIZE_MAX
不等于SSIZE_MAX
。 - Lightness Races in Orbit