Канонический против.неканонический терминальный ввод

StackOverflow https://stackoverflow.com/questions/358342

  •  21-08-2019
  •  | 
  •  

Вопрос

Я готовлюсь к экзамену и не понимаю, насколько канонический или канонический.неканонический ввод/вывод работает в Unix (например, проклятия).Я так понимаю, что есть буфер, к которому применяются "линейные дисциплины" для канонического ввода.Означает ли это, что буфер обходит неканонический ввод, или это просто означает, что никакие строковые дисциплины не применяются?Чем этот процесс отличается для операций ввода и вывода?

В программах Curses, с которыми я работал и демонстрирующих канонический ввод, вводимые пользователем данные автоматически вводятся либо после ввода определенного количества символов, либо по прошествии определенного времени.Считаются ли какие-либо из этих вещей «линейными дисциплинами» или это нечто совершенно иное?

Это было полезно?

Решение

Для канонического ввода — thinkshell;на самом деле, представьте себе старую добрую оболочку Bourne, поскольку в Bash и его родственниках есть редактирование из командной строки.Вы вводите строку ввода;если вы допустили ошибку, вы используете символ стирания (по умолчанию Backspace, обычно;иногда Удалить), чтобы стереть предыдущий символ.Если вы полностью запутались, вы можете отменить всю строку с помощью символа уничтожения строки (не полностью стандартизированного, часто Control-X).В некоторых системах вы можете стереть слово с помощью Control-W.Все это канонический ввод.Собирается и редактируется вся строка до конца символа строки — Возвращаться — нажимается.После этого вся линия становится доступной для ожидающих программ.В зависимости от read() невыполненные системные вызовы, вся строка будет доступна для чтения (одним или несколькими вызовами read()).

Для неканонического ввода — подумайте vi или vim или что угодно — нажимаешь на символ, и он сразу доступен программе.Вас не задержат, пока вы не нажмете «Return».Система не редактирует персонажей;они становятся доступными для программы сразу после их ввода.Программа должна интерпретировать вещи соответствующим образом.Сейчас, vim делает ряд вещей, которые немного похожи на канонический ввод.Например, backspace перемещает назад, а в режиме ввода стирает то, что там было.Но это потому, что vim решает заставить его вести себя таким образом.

Канонический и неканонический вывод — гораздо менее серьёзное дело.Есть несколько различий, связанных с такими вещами, как, например, повторять ли возврат каретки перед переводом строки и делать ли задержки (не обязательно с электроникой;важно в те времена, когда устройством вывода мог быть телетайп со скоростью 110 бод).Он также может выполнять такие действия, как обработка устройств вывода, нечувствительных к регистру — опять же, телетайпов.Строчные буквы выводятся прописными буквами, а прописные — обратной косой чертой и прописными буквами.

Раньше, если вы вводили все заглавные буквы в приглашение для входа в систему, программа входа автоматически переводилась в режим, в котором все заглавные буквы выводились с обратной косой чертой перед каждой фактической заглавной буквой.Подозреваю, что на электронных терминалах этого уже не делают.


В комментарии TitaniumDecoy спросил:

Итак, при неканоническом вводе входной буфер полностью обходится?Кроме того, причем здесь линейные дисциплины?

При неканоническом вводе входной буфер по-прежнему используется;если нет программы с read() вызов ожидает ввода от терминала, символы сохраняются во входном буфере.Чего не происходит, так это редактирования входного буфера.

Линейные дисциплины — это такие вещи, как набор манипуляций, которые выполняет редактирование ввода.Итак, один из аспектов дисциплины строки заключается в том, что символ стирания стирает предыдущий символ в каноническом режиме ввода.Если у вас есть icase (отображение входного регистра), тогда символы верхнего регистра преобразуются в нижний регистр, если им не предшествует обратная косая черта;Я считаю, что это линейная дисциплина или один из аспектов линейной дисциплины.


Забыл упомянуть, что обработка EOF (Control-D) обрабатывается в каноническом режиме;на самом деле это означает «сделать накопленные данные доступными для read()';если нет накопленного ввода (если вы наберете Control-D в начале строки), то read() вернет нулевые байты, которые затем интерпретируются программами как EOF.Конечно, после этого можно весело набирать на клавиатуре больше символов, и программы, игнорирующие EOF (или работающие в неканоническом режиме), будут вполне довольны.

Конечно, в каноническом режиме символы, набираемые с клавиатуры, обычно отображаются на экране;вы можете контролировать, возникает ли это эхо.Однако это несколько имеет отношение к каноническому вводу;нормальное редактирование происходит даже тогда, когда эхо выключено.

Точно так же сигналы прерывания и выхода являются артефактами обработки в каноническом режиме.То же самое можно сказать и о сигналах управления работой, таких как Control-Z чтобы приостановить текущий процесс и вернуться в оболочку.Аналогично, управление потоком (Control-S, Control-Q для остановки и запуска вывода) обеспечивается каноническим режимом.

Глава 4 Рочкинда Продвинутое программирование Unix, 2-е изд. охватывает терминальный ввод-вывод и предоставляет большую часть этой информации — и многое другое.Другие книги по программированию UNIX (по крайней мере, хорошие) также будут посвящены этому вопросу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top