在下面的代码片段中,无论我输入多长时间(编辑:我是用随机字符串复制和粘贴),比如一个包含9998个字符的字符串,当i = 4095时,read()会停止。声明它在EOF字符中读取,但我的字符串没有EOF字符(例如我尝试了一个字符串9998'a')。返回值还表明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()在超过EOF时返回0。
答案 0 :(得分:2)
您最有可能看到终端缓冲区限制 - 终端只能在一行中读取有限数量的字符,如果您输入的内容超过此数量(或模拟使用伪终端输入或剪切-n-paste)在没有输入NL,EOL或EOL2字符的情况下,您将收到一个错误,终端用EOF表示错误(读取返回0)。
通常可以通过将终端设置为非规范模式(它不会尝试缓冲线路以允许退格)来避免此问题。