Unistd read() 最大尺寸
Unistd read() maximum size
在下面的代码片段中,无论我输入多长时间(编辑:我复制并粘贴到一个随机字符串),假设一个包含 9998 个字符的字符串,read() 在 i = 4095 时停止. 它声明它读入了 EOF 字符,但我的字符串没有 EOF 字符(例如我尝试了 9998 'a' 的字符串)。 return 值还表明 read() 没有错误。为什么read()只读入4095字节?
#include <unistd.h>
#include <stdio.h>
int main() {
char temp;
char buf[10000];
int i = 0;
while(read(STDIN_FILENO, &temp, 1) > 0) {
buf[i] = temp;
i++;
}
printf("%d\n", i);
}
编辑:澄清一下,read() 并没有字面说明它读入了 EOF 字符,根据 https://linux.die.net/man/2/read read() returns 0 当它移过 EOF 时。
您很可能看到了终端缓冲区限制 -- 终端只能在一行中读取有限数量的字符,如果您输入的字符数超过此限制(或使用伪终端模拟输入或剪切-n-paste) 而不输入 NL、EOL 或 EOL2 字符,您将收到一个错误,终端用 EOF 指示该错误(读取返回 0)。
您通常可以通过将终端置于非规范模式(它不会尝试缓冲行以允许退格)来避免此问题。
在下面的代码片段中,无论我输入多长时间(编辑:我复制并粘贴到一个随机字符串),假设一个包含 9998 个字符的字符串,read() 在 i = 4095 时停止. 它声明它读入了 EOF 字符,但我的字符串没有 EOF 字符(例如我尝试了 9998 'a' 的字符串)。 return 值还表明 read() 没有错误。为什么read()只读入4095字节?
#include <unistd.h>
#include <stdio.h>
int main() {
char temp;
char buf[10000];
int i = 0;
while(read(STDIN_FILENO, &temp, 1) > 0) {
buf[i] = temp;
i++;
}
printf("%d\n", i);
}
编辑:澄清一下,read() 并没有字面说明它读入了 EOF 字符,根据 https://linux.die.net/man/2/read read() returns 0 当它移过 EOF 时。
您很可能看到了终端缓冲区限制 -- 终端只能在一行中读取有限数量的字符,如果您输入的字符数超过此限制(或使用伪终端模拟输入或剪切-n-paste) 而不输入 NL、EOL 或 EOL2 字符,您将收到一个错误,终端用 EOF 指示该错误(读取返回 0)。
您通常可以通过将终端置于非规范模式(它不会尝试缓冲行以允许退格)来避免此问题。