Ответ 1
Для канонического ввода - думаю, оболочка; на самом деле, подумайте о доброй старомодной оболочке Bourne, так как Bash и родственники имеют редактирование командной строки. Вы вводите строку ввода; если вы допустили ошибку, вы используете символ стирания (по умолчанию это Backspace, обычно, иногда Delete), чтобы стереть предыдущий символ. Если вы полностью испортились, вы можете отменить всю строку с символом kill (не полностью стандартизированным, часто Control-X). В некоторых системах вы получаете слово со стиранием Control-W. Все это канонический ввод. Вся строка собрана и отредактирована до конца символа линии — Return — нажата. В этой связи вся линия доступна для ожидающих программ. В зависимости от системных вызовов read()
, которые выдаются, вся строка будет доступна для чтения (одним или несколькими вызовами read()
).
Для неканонического ввода — подумайте vi
или vim
, или что-то еще -— вы нажимаете символ, и он сразу же доступен для программы. Вы не задерживаетесь, пока не нажмете на возвращение. Система не редактирует символы; они становятся доступными для программы, как только они печатаются. Программа должна правильно интерпретировать вещи. Теперь vim
делает несколько вещей, которые немного напоминают канонический ввод. Например, backspace перемещается назад, а в режиме ввода стирает то, что было там. Но это потому, что vim
решает заставить его вести себя так.
Канонический и неканонический выход - гораздо менее серьезный бизнес. Есть несколько бит и кусочков разницы, связанные с такими вещами, как эхо-возврат каретки перед подачей строки и необходимость делать задержки (не обязательно с электроникой, что важно в те дни, когда устройство вывода могло быть 110- бод телетайп). Он также может делать такие вещи, как дескрипторы вывода без учета регистра -— телетайпов. Буквы нижнего регистра выводятся в шапках и в верхнем регистре как обратная косая черта и колпачки.
Раньше было, что если вы ввели все буквы верхнего регистра в приглашение для входа, то программа входа автоматически преобразуется в режим, когда все кепки будут выводиться с обратной косой чертой перед каждым фактическим капиталом. Я подозреваю, что это больше не делается на электронных терминалах.
В комментарии TitaniumDecoy спросил:
Итак, с неканоническим вводом, полностью ли исключается входной буфер? Кроме того, куда входят линейные дисциплины?
С неканоническим входом входной буфер все еще используется; если нет программы с вызовом read()
, ожидающим ввода с терминала, символы сохраняются во входном буфере. То, что не происходит, - это редактирование входного буфера.
Линейные дисциплины - это такие вещи, как набор манипуляций, которые делает редактирование ввода. Таким образом, один аспект линейной дисциплины состоит в том, что символ стирания стирает предшествующий символ в режиме канонического ввода. Если у вас установлено значение icase
(input case-mapping), то символы верхнего регистра отображаются в нижний регистр, если не предшествует обратная косая черта; это, по-моему, линейная дисциплина или аспект линейной дисциплины.
Я забыл упомянуть, что обработка EOF (Control-D) обрабатывается в каноническом режиме; это фактически означает "сделать накопленный вход доступным для read()
"; если нет накопленного ввода (если вы введете Control-D в начале строки), то read()
вернет нулевые байты, которые затем будут интерпретироваться как EOF по программам. Конечно, вы можете весело набирать больше символов на клавиатуре после этого, и программы, которые игнорируют EOF (или работают в неканоническом режиме), будут вполне довольны.
Конечно, в каноническом режиме символы, набранные на клавиатуре, обычно эхосигналы на экран; вы можете контролировать, происходит ли это эхо. Однако это несколько касательно канонического ввода; нормальное редактирование происходит даже тогда, когда эхо выключено.
Аналогично, сигналы прерывания и выхода являются артефактами обработки канонического режима. Так же сигналы управления работой, такие как Control-Z, приостанавливают текущий процесс и возвращаются в оболочку. Аналогично, управление потоком (Control-S, Control-Q для остановки и запуска вывода) обеспечивается каноническим режимом.
Глава 4 Rochkind Расширенное программирование Unix, 2nd Edn охватывает терминальные операции ввода-вывода и дает большую часть этой информации - и многое другое. Другие книги по программированию UNIX (по крайней мере, хорошие) также будут охватывать его.