'unistd.h'中'read'函数的读取限制是多少?

时间:2011-09-08 14:43:20

标签: file unix io

标准的unix C具有以下功能:

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

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

4 个答案:

答案 0 :(得分:10)

来自man read(2)

  

read()尝试读取从文件描述符fd计入的字节数   缓冲区从buf开始。

     

如果count为零,read()返回零并且没有其他结果。 如果   count大于SSIZE_MAX,结果未指定。

SSIZE_MAX的值取决于您的系统,但通常它类似于signed long的最大值,通常为2 31 (32位系统)或2 63 (64位系统)。

2 31 字节是2千兆字节,所以你可能很安全;实际上,实际的设备驱动程序/缓冲区/网络I / O永远不会一次性为您提供2 GB的数据。

答案 1 :(得分:2)

通常它可以读取buf中可用的字节数。实际上,底层设备驱动程序(无论是文件系统或网络,还是管道)在没有更多可用的情况下返回的内容会少于您想要的内容。

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

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

答案 2 :(得分:1)

  

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

它可以读取缓冲区可以容纳的数量,限制为SSIZE_MAX以及硬件限制。

答案 3 :(得分:1)

引用来自IEEE Std 1003.1(aka POSIX.1)

  

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

因此,您必须在目标平台上检查{ "name": "perials/check", "description": "Package for testing packagist", "license": "MIT", "authors": [ { "name": "Perials", "email": "info@perials.com" } ], "autoload": { "psr-4": {"Abc\\": "src/xyz"} }, "require": {}, "minimum-stability": "dev" } 。例如,FreeBSD男人在错误部分说:

  

[EINVAL]值nbytes大于INT_MAX。