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

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

Чтобы приостановить и продолжить вывод на экран, также предоставляются специальные управляющие коды. В UNIX это символы STOP (CTRL-i-S) и START (CTRL+Q). Они не хранятся в буфере, но используются для установки и сброса флага в структуре данных терминала. При каждой операции вывода на экран проверяется значение этого флага. Если флаг установлен, вывод не производится. Эхо при этом, как правило, также подавляется.

Часто возникает необходимость прервать выполнение отлаживаемой профаммы. Для этой цели могут использоваться символы INTR (DEL) и QUIT (CTRL-i-\). В системе UNIX клавиша DEL посылает сигнал прерывания SIGINT всем процессам, запущенным с этого терминала. Реализация может быть непростой. Наиболее сложным делом является передача информации от драйвера в ту часть системы, которая занимается обработкой сигналов, поскольку она не ожидает получения подобной информации. Результат нажатия клавиш CTRL-t-\ (код Ох 1С) аналогичен нажатию клавиши DEL, с той разницей, что процессам посылается сигнал SIGQUIT, вызывающий прекращение работы процесса с сохранением дампа памяти, если этот сигнал специально не перехватывается процессом. При нажатии любой из означенных клавиш драйвер должен вывести эхо в виде перевода строки и возврата каретки, а также очистить свой буфер с накопленными символами, чтобы позволить начать новый ввод. Часто вместо клавиши DEL для символа INTR по умолчанию используется сочетание клавиш CTRL+C (код 0x03), так как с появлением электронно-лучевых дисплеев стало привычным нажимать клавишу DEL для удаления символа справа от курсора при редактировании.

Специальный символ EOF (CTRL-i-D), означающий конец файла в UNIX, сообщает ожидающей ввода программе, что информации на входе больше не будет. Программа действует так, как если бы при чтении из файла уперлась в его конец.

Некоторые драйверы терминала предоставляют возможность более сложного редактирования строки, чем было описано здесь. Они имеют специальные управляющие символы, позволяющие удалять целиком слова, перемещать курсор вперед и назад по символам и по словам, вставлять текст в середину уже набранной строки и т. д. Добавление подобных функций к драйверу значительно увеличивает его. Кроме того, эти функции чаще всего оказываются неиспользуемыми экранными редакторами, предпочитающими работать с драйверами клавиатуры в сыром режиме.

Стандарт POSIX требует того, чтобы в стандартной библиотеке были доступны несколько функций, позволяющих управлять параметрами терминала. Самые важные из них tcgetattr и tcsetattr. Первая получает от системы копию структуры termios, показанной в листинге 3.3. Эта структура содержит всю информацию, необходимую для задания режимов работы, настройки специальных символов и управления характеристиками терминала. Программа может узнать текущие значения установок и изменить их на свой вкус. Функция tcsetattr позволяет передать эту структуру обратно драйверу терминала.

Стандарт POSIX не раскрывает, как реализовывать свои требования при помощи системных вызовов или библиотечных подпрограмм. В MINIX имеется системный вызов ioctl, записываемый следующим образом: ioctl(file descriptor, request, argp):



Листинг 3.3. Структура termios. В MINIX тип c flag t эквивалентен short, speedj - int и cc t равен char

struct termios {

tcflag t cjflag: /* Режимы ввода */

tcflag t c oflag; /* Режимы вывода */

tcflag t c cflag: /* Режимы управления */

tcflag t c iflag: /* Локальные режимы */

speed t c ispeed: /* Скорость ввода */

speed t c ospeed: /* Скорость вывода */

cc t c cc[NCCS]: /* Управляющие символы */

Этот вызов позволяет определять и изменять конфигурацию многих устройств ввода/вывода. Функции tcgetattr и tcgetattr реализованы на его основе. Здесь переменная request указывает, считывать или записывать структуру termios (для записи также указывается, нужно ли выполнять действие немедленно или отложить до завершения текушей очереди запросов). Переменная argp содержит указатель на структуру termios. Такой подход был выбран по большей мере для совместимости с UNIX, чем из соображений элегантности.

Следует сделать несколько замечаний о структуре termios. Четыре управляющих слова в ней обеспечивают большую гибкость. Отдельные биты поля cjflag отвечают за то, как обрабатываются входные данные. Например, бит ICRNL управляет преобразованием символов CR в NL при вводе. В MINIX этот флаг установлен по умолчанию. Поле c oflags содержит флаги, управляющие выводом. Например, флаг О POST разрешает обработку выводимых данных. Этот бит, а также бит 0NLCR, который руководит преобразованием символов NL в последовательность CR NL, в MINIX устанавливаются по умолчанию. Поле c cflag содержит флаги управления. Установки MINIX по умолчанию разрешают передачу 8-битных символов, кроме того, модем должен класть трубку при отключении пользователя. Поле c lflag - это флаги локального режима. Бит ECHO управляет выводом эха (при входе пользователя в систему эту функцию можно отключить, чтобы обезопасить набор пароля). Один из самых важных битов - бит ICANON, разрешающий канонический режим. Когда ICANON сброшен, существует несколько возможностей. Если сохранить значения по умолчанию для всех остальных настроек, терминал переходит в режим, идентичный традиционному режиму cbreak. В этом режиме символы передаются профамме, не дожидаясь ввода всей строки, но управляющие коды INTR, QUIT, START и STOP сохраняют свой эффект. Это можно отменить, сбросив значения других флагов, и получить эквивалент обычного режима без обработки.

Различные специальные символы, значения которых можно изменить (включая расширения MINIX), хранятся в массиве с сс. Кроме того, в нем хранятся два параметра, используемые в неканоническом режиме. Значение MIN, помещаемое в c cc[VMIN], задает минимальное количество символов, достаточное для вызова read. Величина TIME, хранящаяся в c cc[VTIME], задает лимит времени для этого вызова. К какому результату приводят разные комбинации значений, показано в табл. 3.10, иллюстрирующей обработку вызова, запрашивающего N байтов. Если TIME = О и MIN = 1, поведение аналогично режиму без обработки.



Таблица 3.10. Параметры MIN и TIME определяют, как выполняется чтение в неканоническом режиме. N - число запрошенных байтов

TIME = О TIME > О

MIN = О Вызов завершается немедленно, Сразу же запускается таймер. Возвращается возвращая имеющееся число первый полученный байт, или ни одного, если байтов, от О до N истекло время

MIN > О Вызов возвращает от MIN до N После первого байта запускается межбайтовый байтов. Возможна бесконечная таймер. Возвращается N байтов, если они блокировка уложились во временной интервал, но не

меньше 1 байта. Возможна бесконечная

блокировка

Программное обеспечение вывода

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

Отображаемые на память терминалы позволяют применять еще более простую схему. Символы, которые должны быть напечатаны, один за одним извлекаются из пространства пользователя и записывают непосредственно в видеопамять. В случае с терминалами RS-232 символ просто передается в последовательную линию передачи данных. При отображении в память некоторые символы нуждаются в дополнительной обработке. Среди них символы забоя, возврата каретки, перевода строки и звукового сигнала (CTRL+G). Драйвер отображаемого в память терминала должен программно отслеживать текущее положение курсора, обновляя его после вывода печатного символа. При выводе специальных символов он должен соответствующим образом менять положение курсора.

В частности, переводя строку внизу экрана, необходимо выполнять прокрутку его содержимого. Как работает прокрутка, иллюстрирует рис. 3.20. Если видеоконтроллер всегда располагает начало видеопамяти по адресу ОхВОООО, единственный способ сдвинуть содержимое - скопировать 24 х 80 символов (каждый символ представляется двумя байтами) из области, начинающейся по адресу ОхВООАО, в область ОхВОООО. На это требуется время.

К счастью, обычно аппаратное обеспечение несколько упрощает эту операцию. У большинства видеоконтроллеров имеется регистр, задающий, какому адресу в видеопамяти соответствует первая строка экрана. Благодаря этому, чтобы прокрутить экран вверх на одну строку, можно изменить значение этого регистра так, чтобы видимая область начиналась по адресу ОхВООАО, а не ОхВОООО.



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 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.