2016-11-29 23 views
3

В следующем фрагменте, независимо от того, сколько времени ввода я вставляю (EDIT: я копирую и вставляя случайную строку), скажем строку с 9998 символами, read() останавливается когда i = 4095. Он утверждает, что он читается в EOF-символе, но моя строка не имеет символа EOF (например, я попробовал строку из 9998 'a). Возвращаемое значение также указывает на отсутствие ошибки в read(). Почему read() читает только 4095 байт?Unistd 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); 
} 

Edit: Для того, чтобы уточнить, прочитайте() не буквально утверждать, что он прочитал в EOF символ, за https://linux.die.net/man/2/read чтения() возвращает 0, когда она движется мимо EOF.

+0

"* Он утверждает, что он читается символом EOF, *« А? Что это за «это», о котором вы говорите? И что такое «характер EOF»? –

+2

Как вы используете программу? –

+0

@FrederikDeweerdt, по-видимому, если он читает в EOF, то никоим образом последний 'printf' не распечатает ничего – artm

ответ

2

Вы, скорее всего, видите предельный буфер терминала - терминалы могут читать только ограниченное количество символов в одной строке, а если вы вводите больше, чем это (или имитируете типизацию с помощью псевдотерминала или вырезания, n-paste) без ввода символа NL, EOL или EOL2, вы получите сообщение об ошибке, которое терминал указывает с помощью EOF (чтение возвращается 0).

Обычно вы можете избежать этой проблемы, поставив терминал в неканонический режим (там, где он не пытается создавать буферные линии, чтобы разрешить обратное перемещение).

+0

Терминалы также могут ограничить [количество строк] (http://superuser.com/q/82087/556135) или общий размер пасты, я считаю. – ShadowRanger

+0

Итак, зачем копировать и вставлять большую строку, не попадая в предельный буфер терминала, если я скопирую пасту после ввода в 'echo', а затем помещаю одинарные кавычки вокруг скопированной строки и затем перенаправляя этот вывод в файл .txt? – Poptart

+1

Возможно, вы используете оболочку, которая ставит терминал в неканоническом режиме, когда его основной процесс, поэтому он может выполнять собственное, более сложное редактирование строк. –

 Смежные вопросы

  • Нет связанных вопросов^_^