2016-11-29 171 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,當它的前臺進程處於非規範模式時,它可以執行自己的更復雜的行編輯。 –