Канонический против.неканонический терминальный ввод
Вопрос
Я готовлюсь к экзамену и не понимаю, насколько канонический или канонический.неканонический ввод/вывод работает в 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 (по крайней мере, хорошие) также будут посвящены этому вопросу.