2016-11-29 139 views
3

在下面的代码片段,无论我怎么输入的长期投入(编辑:我复制和粘贴在一个随机字符串),说有9998个字符的字符串,阅读()停止当我= 4095.它声明它读取EOF字符,但我的字符串没有EOF字符(例如,我尝试了一串9998'a's)。返回值还表明read()没有错误。为什么read()只能读取4095字节?Unistd阅读()最大尺寸

#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); 
} 

编辑:澄清,读()不字面上说明它在一个EOF字符阅读,每https://linux.die.net/man/2/read读()返回0它移动过去的EOF时。

+0

“*它表明它是以EOF字符读取的,*”咦?你在说什么“它”?什么是“EOF字符”? –

+2

你如何使用该程序? –

+0

@FrederikDeweerdt @FrederikDeweerdt显然,如果他在EOF中读取,那么没办法,最后一个'printf'会打印出任何东西 – artm

回答

2

你最有可能看到的终端缓冲限制 - 终端只能读取字符数量有限的单行线,如果你键入比这更(或模拟与伪终端或cut-打字如果没有输入NL,EOL或者EOL2字符,你会得到一个错误,终端用EOF表示(读回0)。

通常你可以通过将终端到非规范模式(它不会尝试缓冲线,允许退格)避免这个问题。

+0

终端也可以限制[行数](http://superuser.com/q/82087/556135)或我相信的总贴大小。 – ShadowRanger

+0

那么,为什么复制和粘贴,如果我在'echo'打字,然后把周围的拷贝粘贴的串单引号,然后将该输出重定向到一个文本文件后,复制粘贴大串打不中端缓冲区限制? – Poptart

+1

您可能正在使用一个shell,当它的前台进程处于非规范模式时,它可以执行自己的更复杂的行编辑。 –