Главная страница  Межпроцессное взаимодействие (состязание) 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 [ 86 ] 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187

дельного терминала драйвер становится проще (не требуется управления списком). Такой подход является предпочтительным на персональном компьютере с единственной клавиатурой. Рисунок 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. Специальные символы канонического режима

Символ

Имя в POSIX

Комментарий

CTRL+H

ERASE

Удалить один символ слева

CTRL+U

KILL

Удалить всю введенную строку

CTRL+V

LNEXT

Интерпретировать следующий символ буквально

CTRL+S

STOP

Остановить вывод

CTRL+Q

START

Начать вывод

INTR

Прервать процесс (SIGINT)

CTRL+\

QUIT

Принудительный дамп памяти (SIGQUIT)

CTRL+D

Конец файла

CTRL+M

Возврат каретки (неизменный символ)

CTRL+J

Перевод строки (неизменный символ)

Если пользователь обнаруживал ошибку в начале введенной строки, единственным способом ее исправления во многих старых системах, не позволяющих перемещать курсор влево-вправо, являлось удаление всей строки. В этом случае бывало удобнее воспользоваться специальным символом KILL. В некоторых системах эта строка полностью исчезала с экрана, но в других она оставалась видимой, включая возврат каретки и перевод строки, в соответствии с предпочтениями иных пользователей. Как и ERASE, символ KILL работает только с текущей строкой. При удалении блока символов драйвер вправе вернуть освободившиеся буферы в пул.

Иногда символы ERASE или KILL должны быть введены в строку как обычные данные. Для этого служит символ LNEXT, действующий в качестве префиксного символа. В системе UNIX ему по умолчанию соответствует сочетание клавиш CTRL+V (код 0x16). В более старых версиях UNIX в качестве символа KILL часто используется символ (®, но впоследствии этот символ стал составной частью адресов электронной почты сети Интернет, как, например, linda@cs.wash1ngton.edu. Те, кому привычнее старые соглашения, могут переопределить символ KILL как @, но тогда им придется вводить символ @ буквально при наборе адреса электронной почты. Это можно сделать, нажав на клавиатуре последовательно клавиши CTRL+V и @. Сам символ LNEXT может быть введен, если дважды нажать клавиши CTRL+V. Встретив символ LNEXT, драйвер установит флаг, означающий, что следующий символ не следует подвергать специальной обработке. Сам символ LNEXT не помещается в очередь символов.



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 [ 86 ] 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187

© 2000 - 2018 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.