Архитектура Unix

       

. Алгоритм чтения с терминала



Рисунок 10.15. Алгоритм чтения с терминала



алгоритм terminal_read { если (в каноническом символьном списке отсутствуют дан- ные) { выполнить (пока в списке для неструктурированных вводных данных отсутствует информация) { если (терминал открыт с параметром "no delay" (без задержки)) возвратить управление; если (терминал в режиме без обработки с использо- ванием таймера и таймер не активен) предпринять действия к активизации таймера (таблица ответных сигналов); приостановиться (до поступления данных с термина- ла); } /* в списке для неструктурированных вводных данных есть информация */ если (терминал в режиме без обработки) скопировать все данные из списка для неструктури- рованных вводных данных в канонический список; в противном случае /* терминал в каноническом ре- жиме */ { выполнить (пока в списке для неструктурированных вводных данных есть символы) { копировать по одному символу из списка для неструктурированных вводных данных в кано- нический список: выполнить обработку символов стирания и уда- ления; если (символ - "возврат каретки" или "конец файла") прерваться; /* выход из цикла */ } } } выполнить (пока в каноническом списке еще есть символы и не исчерпано количество символов, указанное в вызове функции read) копировать символы из символьных блоков канонического списка в адресное пространство задачи; }


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









Содержание раздела