2016-11-29 5 views
3

次のスニペットでは、どのくらい入力を入れても(編集:ランダムな文字列にコピーして貼り付けています)、9998文字の文字列、read私は4095です。それはEOF文字で読んでいると言いますが、私の文字列はEOF文字を持っていません(たとえば、私は9998の文字列を試しました)。戻り値は、read()からのエラーもないことを示しています。なぜread()は4095バイトだけを読み込むのですか?Unstd read()最大サイズ

#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読み取り()はEOFを過ぎて移動するときに0を返すごとに、EOF文字で読むことを述べるものではありません。

+0

"*それはEOF文字で読み込まれると述べています。あなたが話している "それ"は何ですか?そして "EOFキャラクター"とは何ですか? –

+2

どのようにプログラムを使用していますか? –

+0

@FrederikDeweerdt明らかに、もし彼がEOFを読んでいれば、最後の 'printf'は何も出力しません。 – artm

答えて

2

ターミナルバッファ制限を見る可能性が最も高い - ターミナルは1行に限られた数の文字しか読み込めません。また、それ以上の文字数を入力すると(擬似端末やカットオフ文字で入力をシミュレートすると、 NL、EOL、またはEOL2文字を入力しないと、エラーが発生します。このエラーは、端末がEOF(0を返す)で示されます。

端末を非正規モード(バックスペースを許可するために回線をバッファリングしようとしない)にすることで、この問題を回避できます。

+0

端末は[回線数](http://superuser.com/q/82087/556135)または私が信じている合計ペーストサイズを制限することもできます。 – ShadowRanger

+0

なぜ、大きな文字列をコピーして貼り付けても、 'echo'を入力した後に貼り付けをコピーして貼り付けた文字列を一重引用符で囲み、その出力を.txtファイルにリダイレクトすると、 – Poptart

+1

おそらく、フォアグラウンドプロセス時に非標準モードに端末を置くシェルを使用しているので、より複雑な独自の行編集を行うことができます。 –