Терминальный интерфейс Unix седьмого издания - Seventh Edition Unix terminal interface
В Терминальный интерфейс Unix седьмого издания является обобщенной абстракцией, включающей как интерфейс прикладного программирования для программ и набор поведенческих ожиданий для пользователей, Терминал как исторически доступно в Седьмое издание Unix. Он был в значительной степени вытеснен Интерфейс терминала POSIX.
Концепции и обзор
Терминальный интерфейс, предоставляемый Seventh Edition Unix и UNIX / 32V, а также представлен BSD версия 4 как старый драйвер терминала, был простым, в основном ориентированным на телетайпы как терминалы. Ввод вводился построчно, причем драйвер терминала в операционной системе (а не сами терминалы) предоставлял простые возможности редактирования строки. Ядро поддерживало буфер, в котором происходило редактирование. Приложения, читающие ввод терминала, получат содержимое буфера только тогда, когда возвращаться На терминале была нажата клавиша для завершения редактирования строки. В @ Ключ, отправленный с терминала в систему, стирает ("уничтожает") все текущее содержимое буфера редактирования и обычно отображается как '@', за которым следует новая строка, чтобы переместить позицию печати на новую пустую строку. В # Ключ, отправленный с терминала в систему, стирает последний символ с конца буфера редактирования и обычно отображается как '#', который пользователи должны будут распознать как обозначающий "стирание" предыдущего символа (телетайпы физически не способны стирать символы после того, как они были напечатаны на бумаге).[1][2][3][4][5]
С точки зрения программирования оконечное устройство должно было передавать и принимать скорость передачи, символы «стирания» и «уничтожения» (которые выполняли редактирование строки, как объяснено), символы «прерывание» и «выход» (генерирование сигналы для всех процессов, для которых терминал был управляющим терминалом), символы «старт» и «стоп» (используются для программное управление потоком ), символ "конца файла" (действует как возврат каретки, но не удаляется из буфера читать()
системный вызов и, следовательно, потенциально вызывающий возврат результата нулевой длины) и различные флаги режима определение того, есть ли местное эхо был эмулирован драйвером терминала ядра, было ли включено управление потоком данных модема, длительность различных задержек вывода, отображение символа возврата каретки и три режима ввода.[6]
Режимы ввода
Три режима ввода для терминалов в Seventh Edition Unix были:
- линейный режим (также называемый "приготовленным" режимом)
- В линейном режиме дисциплина линии выполняет все функции редактирования строки и распознает управляющие символы «прерывание» и «выход» и преобразует их в сигналы, отправляемые процессам. Прикладные программы, считывающие с терминала, получают целые строки после того, как редактирование строки было завершено пользователем, нажав клавишу возврата.[2][7]
- c режим прерывания
- cbreak mode - это один из двух режимов по очереди. (Стивен Р. Борн в шутку сослался на это (Борн 1983, п. 288) как «полуготовый» и, следовательно, «редкий» режим.) Дисциплина строки не выполняет редактирование строки, а управляющие последовательности для функций редактирования строки обрабатываются как обычный ввод символов. Прикладные программы, считывающие с терминала, получают символы немедленно, как только они становятся доступными для чтения во входной очереди. Однако управляющие символы «прерывание» и «выход», а также символы управления потоком модема по-прежнему обрабатываются особым образом и удаляются из входного потока.[8][9]
- сырой режим
- необработанный режим - это другой из двух режимов одновременного ввода символов. Дисциплина строки не выполняет редактирование строки, а управляющие последовательности для функций редактирования строки и различных специальных символов («прерывание», «выход» и управление потоком) обрабатываются как обычный ввод символов. Прикладные программы, считывающие с терминала, получают символы немедленно и получают весь символьный поток без изменений, точно так же, как он поступил с самого терминального устройства.[10][8][9]
В терминальном интерфейсе POSIX эти режимы были заменены системой, состоящей всего из двух режимов ввода: канонический и неканонический. Обработка специальных символов, генерирующих сигнал, в интерфейсе терминала POSIX не зависит от режима ввода и управляется отдельно.
Управляющие терминалы
В Unix седьмой редакции терминала не было контроль работы и группа процессов считалось не таким, каким считается ныне.
Каждый процесс в системе был либо один управляющий терминал, или никакого управляющего терминала. Процесс наследует свой управляющий терминал от своего родителя. Управляющий терминал был приобретен, когда процесс без управляющего терминала открыто()
s файл терминального устройства, который еще не является управляющим терминалом для какого-либо другого процесса. Все процессы, у которых был один и тот же управляющий терминал, были частью единого группа процессов.[11]
Интерфейс прикладного программирования
Программный интерфейс для запроса и изменения всех этих режимов и управляющих символов был ioctl ()
системный вызов. (Это заменило stty ()
и gtty ()
системные вызовы Sixth Edition Unix.)[12][13] Хотя символы «стереть» и «убить» можно было изменить по умолчанию # и @, в течение многих лет после инерции разработки седьмого издания означало, что они были предустановленными значениями по умолчанию в драйверах терминальных устройств, а во многих системах Unix, которые изменяли настройки терминального устройства только как часть процесса входа в систему, в скриптах входа в систему, которые выполнялись после пользователь ввел имя пользователя и пароль, любые ошибки при вводе логина и пароля должны быть исправлены с использованием исторических ключевых символов редактирования, унаследованных от терминалов телетайпа.[4]
Символьные константы, значения которых были фиксированы и определены, а также определения структур данных программного интерфейса были определены в sgtty.h
системный заголовок.[8]
ioctl ()
операции
В ioctl ()
операции были следующими:
символ | структура, на которую указывает третий аргумент | описание |
---|---|---|
ТИОГЕТП | sgttyb | запросить параметры терминала в структуре данных |
TIOSETP | sgttyb | установить параметры терминала из структуры данных, сначала опустошив весь ожидающий вывод и очистив ввод из очереди |
TIOSETN | sgttyb | установить параметры терминала из структуры данных, не дожидаясь и не истощая |
TIOCEXCL | никто | включить режим «эксклюзивного использования» |
TIOCNXCL | никто | выключить режим "исключительного использования" |
TIOCHPCL | никто | включить режим "окончание зависания" |
TIOCFLUSH | никто | очистить все очереди вывода и ввода |
TIOGETC | чарс | запросить параметры терминала в структуре данных |
TIOSETC | чарс | установить параметры терминала из структуры данных |
В sgttyb
структура данных
Одной из структур данных, используемых системными вызовами терминала, является sgttyb
структура, чье определение языка программирования C выглядит следующим образом:[14]
структура sgttyb { char sg_ispeed ; // Скорость ввода char sg_ospeed ; // Скорость вывода char sg_erase ; // Удалить символ char sg_kill ; // Убить персонажа char sg_flags ; // Контрольные флаги} ;
В отличие от терминального интерфейса POSIX, терминальный интерфейс Unix седьмой редакции записывал входные и выходные скорости передачи данных непосредственно в структуру данных.[15]
Скорости ввода и вывода в sg_ispeed
и sg_ospeed
поля принадлежали DEC DH-11, и были числами от 0 до 15, представленными символическими константами (в порядке возрастания) B0
, B50
, B75
, B110
,B134
, B150
, B200
, B300
, B600
, B1200
, B1800
, B2400
, B4800
, B9600
, EXTA
, и EXTB
, где скорость передачи была такой же, как в названии (последние два - «внешний A» и «внешний B»). Установка нулевой скорости передачи вынудила драйвер терминала повесить модем (если терминал был модемным устройством).[14]
В sg_erase
и sg_kill
поля были просто символьными значениями символов «стирания» и «уничтожения», соответственно, по умолчанию значения (ASCII) для '#' и '@' соответственно.[14]
В sg_flags
field задает различные флаги управления вводом и выводом, как в следующей таблице.
символ | восьмеричное значение | описание |
---|---|---|
BSDELAY | 0100000 | задержка при написании BS символы |
BS0 | 0000000 | |
BS1 | 0100000 | |
VTDELAY | 0040000 | задержка при написании VT и FF символы |
FF0 | 0000000 | |
FF1 | 0040000 | |
CRDELAY | 0030000 | задержка при написании CR символы |
CR0 | 0000000 | |
CR1 | 0010000 | |
CR2 | 0020000 | |
CR3 | 0030000 | |
TBDELAY | 0006000 | задержка при написании TAB символыXTABS технически не определяет задержку, а заставляет символы табуляции преобразовываться в последовательности из одного или нескольких пробелов. |
TAB0 | 0000000 | |
TAB1 | 00002000 | |
TAB2 | 0004000 | |
XTABS | 0006000 | |
NLDELAY | 0001400 | задержка при написании LF символы |
NL0 | 0000000 | |
NL1 | 00000400 | |
NL2 | 0001000 | |
NL3 | 0001400 | |
EVENP | 0000200 | четный паритет |
ODDP | 0000100 | нечетная четность |
СЫРОЙ | 0000040 | "сырой" режим |
CRMOD | 0000020 | режим отображения возврата каретки (CR сопоставляется с LF на входе и оба CR и LF превратились в CR+LF на выходе) |
ЭХО | 0000010 | местное эхо эмуляция драйвером терминала |
LCASE | 0000004 | преобразовать верхний регистр в нижний регистр при вводе |
CBREAK | 0000002 | режим "cbreak" |
ТАНДЕМ | 0000001 | включить управление потоком модема |
В чарс
структура данных
Одной из структур данных, используемых системными вызовами терминала, является чарс
структура, чье определение языка программирования C выглядит следующим образом:[16]
структура чарс { char t_intrc ; // Прерывать char t_quitc ; // Покидать char t_startc ; // Начинать char t_stopc ; // Останавливаться char t_eofc ; // Конец файла char t_brkc ; // Разрыв (альтернатива зашитому символу LF с тем же эффектом)} ;
Значения этих полей были значениями различных программно настраиваемых специальных символов. Значение -1 в любом поле отключило его распознавание драйвером терминала.[16]
Рекомендации
- ^ Борн 1983, п. 8.
- ^ а б Борн 1983, п. 130–131.
- ^ а б Борн 1983, п. 287.
- ^ а б Кристиан 1988, п. 26.
- ^ Leffler et al. 1989 г., п. 262.
- ^ Борн 1983, п. 132–133.
- ^ Leffler et al. 1989 г., п. 259–260.
- ^ а б c Борн 1983, п. 288.
- ^ а б Leffler et al. 1989 г., п. 260.
- ^ Борн 1983, п. 132.
- ^ Борн 1983, п. 130.
- ^ Борн 1983, п. 133.
- ^ Кристиан 1988, п. 393.
- ^ а б c Борн 1983, п. 286.
- ^ Злотник 1991, п. 166.
- ^ а б Борн 1983, п. 289.
Библиография
- Борн, Стивен Р. (1983). Система UNIX. Международная серия информатики. Эддисон-Уэсли. ISBN 978-0-201-13791-0.CS1 maint: ref = harv (связь)
- Кристиан, Кааре (1988). Операционная система UNIX (2-е изд.). Джон Вили и сыновья. ISBN 978-0-471-84781-6.CS1 maint: ref = harv (связь)
- Леффлер, Сэмюэл Дж .; МакКьюзик, Маршалл Кирк; Карелс, Майкл Дж .; Квартирант, Джон С. (1989). «Терминальное обслуживание». Дизайн и реализация операционной системы 4.3BSD UNIX. Серия Аддисона-Уэсли по информатике. Эддисон-Уэсли. ISBN 978-0-201-06196-3.CS1 maint: ref = harv (связь)
- Злотник, Фред (1991). «Управление терминальными устройствами». Стандарт POSIX.1: руководство программиста. Бенджамин / Каммингс Паб. Co. ISBN 978-0-8053-9605-8.CS1 maint: ref = harv (связь)