Unistd read()最大大小

时间:2016-11-29 02:19:15

标签: c unistd.h

在下面的代码片段中,无论我输入多长时间(编辑:我是用随机字符串复制和粘贴),比如一个包含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。

1 个答案:

答案 0 :(得分:2)

您最有可能看到终端缓冲区限制 - 终端只能在一行中读取有限数量的字符,如果您输入的内容超过此数量(或模拟使用伪终端输入或剪切-n-paste)在没有输入NL,EOL或EOL2字符的情况下,您将收到一个错误,终端用EOF表示错误(读取返回0)。

通常可以通过将终端设置为非规范模式(它不会尝试缓冲线路以允许退格)来避免此问题。