【问题标题】:What is the reading limit of function 'read' in 'unistd.h'?“unistd.h”中函数“read”的读取限制是多少?
【发布时间】:2011-09-08 14:43:19
【问题描述】:

标准的 unix C 有这个功能:

ssize_t read(int fd, void *buf, size_t count);

但是这个“读取”函数可以读取 1 次的最大字节数是多少?

【问题讨论】:

  • @Tomalak:问题不在于两种语言。

标签: file unix io


【解决方案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 的数据块。

【讨论】:

    【解决方案2】:

    通常它可以读取buf 中可用的尽可能多的字节。实际上,如果没有更多可用的东西,底层设备驱动程序(无论是文件系统、网络还是管道)返回的值将少于您想要的。

    因此,read 的特定行为取决于内核中的底层驱动程序。

    这就是为什么始终检查read 的返回值并检查读取的实际字节很重要的原因。

    【讨论】:

      【解决方案3】:

      引用 IEEE Std 1003.1(又名 POSIX.1)

      如果 nbyte 的值大于 {SSIZE_MAX},则结果是实现定义的。

      所以你必须在你的目标平台上检查man 2 read。例如,FreeBSD man 在 ERRORS 部分说:

      [EINVAL] nbytes 的值大于 INT_MAX。

      【讨论】:

        【解决方案4】:

        read() 接受一个打开的文件描述符、一个缓冲区的地址和一个 number,字节数。它尝试将计数字节读入 描述符描述的文件中的缓冲区。重要的是要 确保 buf 指向至少 count 个存储字节!

        它可以读取尽可能多的缓冲区可以容纳,限制是 SSIZE_MAX 以及硬件的限制。

        【讨论】:

        • 您不能要求超过 SIZE_MAX 字节,并且由于您可能想知道您实际设法阅读了多少(并遵循规范),因此您仅限于 SSIZE_MAX 字节。跨度>
        • @janne: 但是 SIZE_MAX 是 0xFFFF'FFFF (VC++)!你真的是指那个数字吗?
        • @Paul: SIZE_MAX != SSIZE_MAX.
        • 无论如何,'有符号'或'无符号',这个 *_MAX 仍然是一个 32 位数字,对于常规文件来说非常大。如果可以读取 *_MAX 个字节,那就太好了!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-11
        • 1970-01-01
        • 2013-07-06
        • 1970-01-01
        • 2014-12-21
        相关资源
        最近更新 更多