Вы спрашиваете:
При вводе данных из стандартного ввода, как правило, пользователь нажимает ввод по завершении. Но read () также рассматривает '\ n' как входные данные, в этом случае n = 1 и условное выражение не оценивается как ложное.
Первое утверждение, безусловно, верно. Клавиша ввода эквивалентна клавише новой строки, поэтому, когда пользователь нажимает клавишу ввода, клавиатура генерирует символ новой строки, и поэтому функция read()
возвращает этот символ. Очень важно, чтобы он это сделал.
Следовательно, ваше условие ошибочно - пустая строка будет содержать новую строку, и, следовательно, количество байтов будет равно единице. Действительно, есть только один способ получить вызов read()
, возвращающий 0, когда стандартным вводом является клавиатура, и это ввести символ 'EOF' - обычно это control-D в Unix, control-Z в DOS. В Unix этот символ интерпретируется драйвером терминала как «отправить предыдущие входные данные в программу, даже если еще нет новой строки». И если пользователь ничего больше не набрал в строке, то возврат от read()
будет нулевым. Если входные данные поступают из файла, то после считывания последних данных последующие чтения вернут 0 байтов.
Если входные данные поступают из канала, то после прочтения всех данных в канале вызов read()
будет блокироваться до тех пор, пока не будет закрыт последний дескриптор файла, который может записать в канал; если этот дескриптор файла находится в текущем процессе, то read()
будет зависать вечно, даже если зависший процесс никогда не сможет write()
к дескриптору файла - при условии, конечно, однопоточного процесса.