Главная страница Межпроцессное взаимодействие (состязание) дельного терминала драйвер становится проще (не требуется управления списком). Такой подход является предпочтительным на персональном компьютере с единственной клавиатурой. Рисунок 3.23 иллюстрирует разницу между этими двумя методами. Структура данных терминала Структура данных терминала Терминал О 1 2 3 Центральный пул буферов Терминал Область буфера для терминала О Область буфера для терминала 1 Рис. 3.23. а - центральный пул буферов; б - выделенный буфер для каждого терминала Хотя клавиатура и экран являются логически разделенными устройствами, многие пользователи привыкли видеть только что введенные с клавиатуры символы отображаемыми на экране. Некоторые (старые) терминалы должны были автоматически (аппаратно) отображать все, что вводилось с клавиатуры, что не только крайне неудобно при вводе паролей, но также значительно ограничивает гибкость сложных редакторов и других программ. К счастью, на большинстве терминалов при нажатии клавиши ничего автоматически не отображается. Отображением символов на экране занимается исключительно программное обеспечение. Этот процесс называется печатью эха или эхо-отображением. Эхо-отображение несет в себе ту сложность, что во время нажатия пользователем клавиши профамма может осуществлять правильный вывод на экран. По меньшей мере, драйвер должен решить, где поместить эхо так, чтобы оно не кануло под выводным потоком программы. Кроме того, если пользователь ввел более 80 символов в одной строке, вывод эха на 80-символьном экране может выглядеть по-разному. В зависимости от приложения переход на следующую строку может оказаться приемлемым либо неприемлемым. Некоторые драйверы просто усекают все введенные строки до 80 символов, игнорируя все после 80-й колонки. Еще одна проблема заключается в обработке символов табуляции. Обычно драйвер вычисляет текущую позицию курсора, учитывая как вывод программы, так и эхо , после чего вычисляет число отображаемых до позиции табулятора пробелов. Наконец, существует проблема эквивалентности устройств. Логически в конце строки текста требуется символ возврата каретки, чтобы переместить курсор обратно к колонке 1, и символ перевода строки для перемещения курсора на следующую строку. Требовать от пользователя вводить оба символа - вряд ли удачная мысль, хотя на некоторых терминалах имеется специальная клавиша, посылающая оба символа с 50%-й вероятностью в том порядке, в котором их ожидает программа. Преобразование всего, что поступает с клавиатуры в стандартный внутренний формат, используемый операционной системой, является одной из задач драйвера. Если стандартом регламентируется хранение только символов перевода строки (соглашение UNIX), тогда символы возврата каретки должны преобразовываться в символы перевода строки. Если внутренний формат предусматривает хранение обоих символов (соглашение Windows), тогда драйвер должен формировать символ перевода строки при получении символа возврата каретки, и наоборот. Независимо от внутренних правил, терминал может требовать наличия обоих символов для корректного управления выводом на экран. Поскольку к большому компьютеру могут оказаться подключенными терминалы различных типов, драйвер клавиатуры должен заниматься преобразованием всех различных комбинаций символа возврата каретки и символа перевода строки во внутренний стандарт, а также следить за правильностью эхопечати. И это еще не все. Другая проблема, связанная с перемещением на новую строку. Некоторым терминалам, чтобы отобразить такие символы, требуется больше времени, чем на отображение нормальных символов, букв или цифр. К примеру, если микропроцессору в терминале, чтобы выполнить прокрутку экрана, нужно скопировать большой блок текста, то перевод строки может выполняться медленно. Если механической печатающей головке надо вернуться к левому полю документа, на вывод символа возврата каретки потребуется больше времени. В обоих случаях драйвер терминала может вставлять в выходной поток символы заполнения (пустые символы) или же просто приостанавливать вывод на некоторое время, чтобы терминал успел за потоком символов. Необходимая задержка часто связана со скоростью терминала. Например, на скорости 4800 бит/с и ниже задержка вряд ли нужна, а на 9600 бит/с и выше может понадобиться один заполняющий символ. Терминалам с аппаратной поддержкой табуляции, особенно тем, которые выдают печатный документ, дополнительная задержка может потребоваться после символа табуляции. При работе в каноническом режиме некоторые вводимые символы имеют особое значение. В табл. 3.9 показаны все специальные символы, определенные стандартом POSIX. По умолчанию все они являются управляющими символами, которые не должны конфликтовать с вводимым текстом или кодами, используемыми программами. Однако все символы, кроме последних двух, допустимо профаммно изменять. Символ ERASE позволяет пользователю удалить один только что введенный символ, что обычно делается клавишей забой (backspace) или комбинацией клавиш CTRL+H (обоим вариантам соответствует код 0x08). Этот символ не добавляется к очереди символов, а, наоборот, удаляет предыдущий символ из очереди. Печать эха для такого символа должна выглядеть как последовательность трех символов: перемещение курсора на позицию влево, пробел и еще раз возврат на позицию, чтобы удалить с экрана предыдущий символ. Если же предыдущим символом был символ табуляции, его удаление зависит от его же интерпретации при печати. Если он был преобразован в пробелы, необходима дополнительная информация о том, насколько далеко следует смещать курсор. Если же сам символ табуляции хранится в очереди ввода, он может быть удален, а вся строка напечатана еще раз. В большинстве систем символ ERASE удаляет символы текущей строки. Символы из предыдущей строки и разделяющие строки символы возврата каретки или перевода строки не удаляются. Таблица 3.9. Специальные символы канонического режима
Если пользователь обнаруживал ошибку в начале введенной строки, единственным способом ее исправления во многих старых системах, не позволяющих перемещать курсор влево-вправо, являлось удаление всей строки. В этом случае бывало удобнее воспользоваться специальным символом KILL. В некоторых системах эта строка полностью исчезала с экрана, но в других она оставалась видимой, включая возврат каретки и перевод строки, в соответствии с предпочтениями иных пользователей. Как и ERASE, символ KILL работает только с текущей строкой. При удалении блока символов драйвер вправе вернуть освободившиеся буферы в пул. Иногда символы ERASE или KILL должны быть введены в строку как обычные данные. Для этого служит символ LNEXT, действующий в качестве префиксного символа. В системе UNIX ему по умолчанию соответствует сочетание клавиш CTRL+V (код 0x16). В более старых версиях UNIX в качестве символа KILL часто используется символ (®, но впоследствии этот символ стал составной частью адресов электронной почты сети Интернет, как, например, linda@cs.wash1ngton.edu. Те, кому привычнее старые соглашения, могут переопределить символ KILL как @, но тогда им придется вводить символ @ буквально при наборе адреса электронной почты. Это можно сделать, нажав на клавиатуре последовательно клавиши CTRL+V и @. Сам символ LNEXT может быть введен, если дважды нажать клавиши CTRL+V. Встретив символ LNEXT, драйвер установит флаг, означающий, что следующий символ не следует подвергать специальной обработке. Сам символ LNEXT не помещается в очередь символов.
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |