первый EOF, не работающий?

У меня есть Ubuntu 16.04 LTS и когда я выполняю что-то в терминале как md5sum это ожидает моего входа, и я ввожу что-то как Hello но когда я нажимаю CTRL+D, он не завершается, и я должен потребовать у CTRL+D второго раза для завершения этого! почему?

1
задан 8 November 2016 в 13:48

1 ответ

В Unix большинство объектов можно читать и записать - обычные файлы, каналы, терминалы, диски неструктурированного диска - все сделаны напомнить файлы.

Программа как cat чтения от его стандартного входа как это:

n = read(0, buffer, 512);

который просит 512 байтов. n число байтов на самом деле чтение, или-1, если существует ошибка.

Если бы Вы неоднократно делали это с обычным файлом, то Вы получили бы набор 512 побайтовых чтений, то несколько более короткое чтение в заключительной части файла, то 0, если бы Вы пытались читать мимо конца файла. Так, cat будет работать до n <= 0.

Чтение из терминала немного отличается. После ввода в строке, завершенной клавишей Enter, read возвраты просто та строка.

Существует несколько специальных символов, которые можно ввести. Каждый - Ctrl-D. При вводе этого операционная система отправляет всю текущую строку, которую Вы ввели (но не сам Ctrl-D) к программе, делающей чтение. И вот случайная вещь: если Ctrl-D является первым символом на строке, программа отправляется строку длины 0 - точно так же, как программа видела бы, добралось ли это просто в конец обычного файла. cat ничего не должен делать по-другому, читает ли это из обычного файла или терминала.

Другой специальный символ является Ctrl-Z. При вводе его, где угодно в строке, операционная система отбрасывает то, что Вы ввели вплоть до той точки, и отправляет сигнал SIGTSTP в программу, которая обычно останавливает (паузы) его и возвращает управление оболочке.

Таким образом в Вашем примере

$ cat > file.txt
pa bam pshhh<Ctrl+Z>
[2]+  Stopped         cat > file.txt

Вы ввели некоторые символы, которые были отброшены, затем cat был остановлен не записав что-либо в его выходной файл.

$ cat > file.txt
pa bam pshhh
<Ctrl+Z>
[2]+  Stopped         cat > file.txt

Вы ввели в одной строке, который cat читайте и записал в его выходной файл и затем остановленный Ctrl-Z cat.

Источник: Ctrl+D для конечного терминального входа строки отвечают Mark Plotnick

1
ответ дан 7 December 2019 в 15:45

Другие вопросы по тегам:

Похожие вопросы: