标准的unix C具有以下功能:
ssize_t read(int fd, void *buf, size_t count);
但是这个'read'函数可以读取1次的最大字节数是多少?
答案 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。