Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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 (по крайней мере, хорошие) также будут охватывать его.