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

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

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

11.12.2008 03:10:57
1 ОТВЕТ
РЕШЕНИЕ

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

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

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

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


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

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

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

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


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

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

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

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

82
10.02.2016 15:01:00
Итак, при неканоническом вводе входной буфер полностью обойден? Кроме того, где линейные дисциплины входят?
titaniumdecoy 11.12.2008 03:45:14