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

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

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

1 ответ

Решение

Для канонического ввода - думаю, shell; на самом деле, подумайте о старой доброй оболочке Bourne, так как Bash и ее родственники редактируют из командной строки. Вы вводите строку ввода; Если вы допустили ошибку, вы используете символ удаления (по умолчанию это Backspace, обычно; иногда Delete), чтобы удалить предыдущий символ. Если вы запутались полностью, вы можете отменить всю строку символом уничтожения строки (не полностью стандартизировано, часто 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 " Расширенного программирования Unix" компании Rochkind , 2-й Эдн, описывает ввод-вывод терминала и дает большую часть этой информации - и многое другое. Другие книги по UNIX-программированию (по крайней мере, хорошие) также освещают это.

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