【问题标题】:Unistd read() maximum sizeUnistd read() 最大大小
【发布时间】:2016-11-29 02:19:14
【问题描述】:

在下面的 sn-p 中,无论我输入多长时间(编辑:我正在复制和粘贴随机字符串),比如说一个包含 9998 个字符的字符串,read() 在 i = 4095 时停止. 它声明它读入一个 EOF 字符,但我的字符串没有 EOF 字符(例如,我尝试了一个 9998 'a's 的字符串)。返回值还表明 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。

【问题讨论】:

  • "它声明它以 EOF 字符读取," 嗯?你说的“它”是什么?什么是“EOF 字符”?
  • 你是如何使用这个程序的?
  • @FrederikDeweerdt 显然如果他在 EOF 中阅读,那么最后一个 printf 将不会打印出任何东西
  • @DavidSchwartz 当 read() 读取 EOF 文件字符时,它返回 0。
  • @Cat:我怀疑您的复制粘贴中存在问题(例如,系统级复制缓冲区限制)。尝试将该随机字符串保存到文件中,使用wc nameoffile 检查它的预期长度,然后尝试./foo &lt; nameoffile

标签: c unistd.h


【解决方案1】:

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

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

【讨论】:

  • 终端也可以限制number of lines或我相信的总粘贴大小。
  • 那么,如果我在输入echo 之后复制粘贴,然后在复制粘贴的字符串周围加上单引号,然后将该输出重定向到.txt 文件?
  • 您可能正在使用一个外壳程序,当终端处于前台进程时,它会将终端置于非规范模式,因此它可以自己进行更复杂的行编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
相关资源
最近更新 更多