【发布时间】:2011-09-08 14:43:19
【问题描述】:
标准的 unix C 有这个功能:
ssize_t read(int fd, void *buf, size_t count);
但是这个“读取”函数可以读取 1 次的最大字节数是多少?
【问题讨论】:
-
@Tomalak:问题不在于两种语言。
标准的 unix C 有这个功能:
ssize_t read(int fd, void *buf, size_t count);
但是这个“读取”函数可以读取 1 次的最大字节数是多少?
【问题讨论】:
来自man read(2):
read()尝试从文件描述符 fd 中读取 count 个字节到 缓冲区从 buf 开始。如果 count 为零,
read()返回零并且没有其他结果。 如果 计数大于SSIZE_MAX,结果未指定。
SSIZE_MAX 的值取决于您的系统,但通常类似于signed long 的最大值,通常为 231(32 位系统)或 263(64 位系统)。
231 字节是 2 GB,所以你可能是安全的;实际上,实际的设备驱动程序/缓冲区/网络 I/O 永远不会一次性为您提供 2 GB 的数据块。
【讨论】:
通常它可以读取buf 中可用的尽可能多的字节。实际上,如果没有更多可用的东西,底层设备驱动程序(无论是文件系统、网络还是管道)返回的值将少于您想要的。
因此,read 的特定行为取决于内核中的底层驱动程序。
这就是为什么始终检查read 的返回值并检查读取的实际字节很重要的原因。
【讨论】:
引用 IEEE Std 1003.1(又名 POSIX.1)
如果 nbyte 的值大于 {SSIZE_MAX},则结果是实现定义的。
所以你必须在你的目标平台上检查man 2 read。例如,FreeBSD man 在 ERRORS 部分说:
[EINVAL] nbytes 的值大于 INT_MAX。
【讨论】:
read() 接受一个打开的文件描述符、一个缓冲区的地址和一个 number,字节数。它尝试将计数字节读入 描述符描述的文件中的缓冲区。重要的是要 确保 buf 指向至少 count 个存储字节!
它可以读取尽可能多的缓冲区可以容纳,限制是 SSIZE_MAX 以及硬件的限制。
【讨论】:
SIZE_MAX != SSIZE_MAX.