c - Unistd read() 最大尺寸

标签 c unistd.h

在下面的代码片段中,无论我输入多长时间(编辑:我复制并粘贴到一个随机字符串),假设一个包含 9998 个字符的字符串,read() 在 i = 4095 时停止。它声明它读取的是 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);
}

编辑:澄清一下,根据 https://linux.die.net/man/2/read,read() 并没有字面说明它读入了一个 EOF 字符。 read() 在经过 EOF 时返回 0。

最佳答案

您很可能会看到终端缓冲区限制——终端只能在一行中读取有限数量的字符,如果您输入的字符多于此(或使用伪终端或 cut-n 模拟输入) -paste) 而不输入 NL、EOL 或 EOL2 字符,您将收到一个错误,终端用 EOF 指示该错误(读取返回 0)。

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

关于c - Unistd read() 最大尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40856758/

相关文章:

c - open() 和 read() 系统调用...程序未执行

c++ - 日期/时间转换 : string representation to time_t

c - 一些 "weird"C 代码

c - 访问结构内的数组元素(它是结构数组的一部分)(在 C 中)

C : Create a function to diplay number just with "write" function

c - 来自链接目录的 get_cwd()

c - 在 Windows 中,即使没有待处理的输入,如何强制 C 的 fread 返回?

c - 使用带指针的结构的问题

c - 导入unistd.h后,编译器声明sbrk()是隐式声明。为什么是这样?

c - 如何使用正确的参数在 C 中调用 execl()?