2016-11-29 5 views
3

Im folgenden Ausschnitt, egal wie lange eine Eingabe ich (EDIT: Ich bin Kopie und Einfügen in einer zufälligen Zeichenfolge), sagen eine Zeichenfolge mit 9998 Zeichen, lesen() stoppt Wenn i = 4095. Es gibt an, dass es in einem EOF-Zeichen gelesen wird, aber meine Zeichenfolge hat kein EOF-Zeichen (zum Beispiel habe ich eine Zeichenfolge von 9998 'a's versucht). Der Rückgabewert deutet auch darauf hin, dass es keinen Fehler von read() gibt. Warum liest read() nur 4095 Bytes ein?Unistd lesen() maximale Größe

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

Edit: Um zu klären, lesen() sagen nicht wörtlich, dass es in einem EOF-Zeichen lesen, pro https://linux.die.net/man/2/read read() 0 zurück, wenn es vorbei an der EOF bewegt.

+0

"* Es heißt, es in einem EOF-Zeichen lesen, *" Huh? Über welches "es" sprichst du? Und was ist ein "EOF-Charakter"? –

+2

Wie benutzen Sie das Programm? –

+0

@FrederikDeweerdt anscheinend, wenn er in EOF liest dann keine Möglichkeit, die letzte 'printf' würde irgendetwas ausdrucken – artm

Antwort

2

Sie sehen wahrscheinlich das Terminal-Pufferlimit - Terminals können nur eine begrenzte Anzahl von Zeichen in einer einzigen Zeile lesen, und wenn Sie mehr eingeben (oder simulieren Sie die Eingabe mit einem Pseudo-Terminal oder Cut- n-einfügen), ohne ein NL-, EOL- oder EOL2-Zeichen einzugeben, erhalten Sie einen Fehler, den das Terminal mit einem EOF anzeigt (lesen Sie 0 zurück).

Sie können dieses Problem im Allgemeinen vermeiden, indem Sie das Terminal in den nicht-kanonischen Modus versetzen (in dem es nicht versucht, die Zeilen zu puffern, um das Zurücksetzen zu ermöglichen).

+0

Terminals können auch begrenzen [Anzahl der Zeilen] (http://superuser.com/q/82087/556135) oder Gesamtpaste Größe glaube ich. – ShadowRanger

+0

Warum also Kopieren und Einfügen der großen Zeichenfolge nicht die Terminal-Puffer-Grenze, wenn ich Einfügen nach Eingabe von echo kopieren und dann in Anführungszeichen um die kopierte Zeichenfolge einfügen und dann diese Ausgabe in eine TXT-Datei umleiten? – Poptart

+1

Sie verwenden wahrscheinlich eine Shell, die das Terminal in den nicht-kanonischen Modus versetzt, wenn es der Vordergrundprozess ist, so dass es seine eigene, komplexere Linienbearbeitung durchführen kann. –