Терминальный интерфейс Unix седьмой редакции
Терминальный интерфейс седьмого издания Unix — это обобщенная абстракция, включающая в себя как интерфейс прикладного программирования для программ, так и набор поведенческих ожиданий для пользователей терминала, исторически доступного в седьмом издании Unix . Он был в значительной степени заменен терминальным интерфейсом POSIX .
Концепции и обзор
[ редактировать ]Терминальный интерфейс, предоставляемый седьмым изданием Unix и UNIX/32V , а также представленный BSD версии 4 как старый драйвер терминала , был простым и в основном ориентирован на телетайпы в качестве терминалов. Ввод вводился построчно, причем драйвер терминала в операционной системе (а не в самих терминалах) обеспечивал простые возможности редактирования строк. Ядро поддерживало буфер, в котором происходило редактирование. Приложения, читающие входные данные терминала, будут получать содержимое буфера только тогда, когда return На терминале была нажата клавиша для завершения редактирования строки. @ Ключ, отправленный с терминала в систему, сотрет («уничтожит») все текущее содержимое буфера редактирования и обычно отображается как ' @', за которым следует последовательность новой строки, чтобы переместить позицию печати на новую пустую строку. # Ключ, отправленный с терминала в систему, удалит последний символ из конца буфера редактирования и обычно отображается как ' #', который пользователи должны будут распознать как обозначающий «затирание» предыдущего символа (телетайпы физически не способны стирать символы после того, как они были напечатаны на бумаге). [1] [2] [3] [4] [5]
С точки зрения программирования, терминальное устройство имело скорости передачи и приема , символы «стирания» и «уничтожения» (которые, как объяснялось, выполняли редактирование строки), символы «прерывания» и «выхода» (генерирующие сигналы для всех процессы, для которых терминал был управляющим терминалом), символы «старт» и «стоп» (используемые для программного управления потоком данных ), символ «конца файла» (действующий как возврат каретки, за исключением того, что он удаляется из буфера read()
системный вызов и, следовательно, потенциально вызывающий возврат результата нулевой длины) и различные флаги режима , определяющие, было ли локальное эхо эмулировано драйвером терминала ядра, было ли включено управление потоком данных через модем, длины различных задержек вывода, отображение возврата каретки символ и три режима ввода. [6]
Режимы ввода
[ редактировать ]В седьмом издании Unix было три режима ввода для терминалов:
- линейный режим (также называемый «режим приготовления»)
- В линейном режиме дисциплина линии выполняет все функции редактирования строки, распознает управляющие символы «прерывание» и «выход» и преобразует их в сигналы, отправляемые процессам. Прикладные программы, читающие с терминала, получают целые строки после завершения редактирования строки пользователем, нажав Enter. [2] [7]
- режим cbreak
- Режим cbreak — это один из двух режимов посимвольной обработки. ( Стивен Р. Борн в шутку назвал его ( Bourne 1983 , стр. 288) «полуготовым» и, следовательно, «редким» режимом.) Дисциплина линии не выполняет редактирование строки, а управляющие последовательности для функций редактирования строки обрабатываются как обычный ввод символов. Прикладные программы, считывающие с терминала, получают символы немедленно, как только они становятся доступными во входной очереди для чтения. Однако управляющие символы «прерывание» и «выход», а также символы управления потоком данных модема по-прежнему обрабатываются особым образом и удаляются из входного потока. [8] [9]
- необработанный режим
- необработанный режим — это другой из двух посимвольных режимов. Дисциплина строки не выполняет редактирование строки, а последовательности управления как для функций редактирования строки, так и для различных специальных символов («прерывание», «выход» и управление потоком) обрабатываются как обычный ввод символов. Прикладные программы, считывающие с терминала, получают символы немедленно и получают весь поток символов без изменений, так же, как он поступил от самого терминального устройства. [10] [8] [9]
В терминальном интерфейсе POSIX эти режимы были заменены системой, состоящей всего из двух режимов ввода: канонического и неканонического . Обработка специальных символов, генерирующих сигналы, в интерфейсе терминала POSIX не зависит от режима ввода и контролируется отдельно.
Управляющие терминалы
[ редактировать ]В седьмой редакции Unix не было управления заданиями терминалов , и группа процессов считалась не такой, как сейчас.
Каждый процесс в системе имел либо единственный управляющий терминал , либо вообще не имел управляющего терминала. Процесс наследует управляющий терминал от родителя. Управляющий терминал был получен, когда процесс без управляющего терминала open()
Это файл терминального устройства, который еще не является управляющим терминалом для какого-либо другого процесса. Все процессы, имевшие один и тот же управляющий терминал, входили в одну группу процессов . [11]
Интерфейс прикладного программирования
[ редактировать ]Программный интерфейс для запроса и изменения всех этих режимов и управляющих символов был ioctl()
системный вызов . (Это заменило stty()
и gtty()
системные вызовы шестого издания Unix.) [12] [13] Хотя символы «стереть» и «уничтожить» можно было изменить по умолчанию, # и @, в течение многих лет после инерции разработки седьмого издания означала, что они были предустановленными значениями по умолчанию в драйверах терминальных устройств, а во многих системах Unix, которые изменяли настройки терминального устройства только как часть процесса входа в систему, в сценариях входа в систему, которые выполнялись после пользователь ввел имя пользователя и пароль, любые ошибки при запросе логина и пароля необходимо было исправлять, используя исторические ключевые символы редактирования, унаследованные от терминалов телетайпа. [4]
Символические константы, значения которых были фиксированы и определены, а также определения структур данных программного интерфейса были определены в файле sgtty.h
системный заголовок. [8]
ioctl()
операции
[ редактировать ] The ioctl()
операции были следующие:
символ | структура, на которую указывает третий аргумент | описание |
---|---|---|
TIOGETP |
sgttyb |
запрос параметров терминала в структуру данных |
TIOSETP |
sgttyb |
установить параметры терминала из структуры данных, сначала очищая весь ожидающий вывод и очищая входные данные в очереди |
TIOSETN |
sgttyb |
установить параметры терминала из структуры данных, не дожидаясь и не сливая |
TIOCEXCL |
никто | включить режим «эксклюзивного использования» |
TIOCNXCL |
никто | отключить режим «эксклюзивного использования» |
TIOCHPCL |
никто | включить режим «зависание при последнем закрытии» |
TIOCFLUSH |
никто | очистить все очереди вывода и ввода |
TIOGETC |
tchars |
запрос параметров терминала в структуру данных |
TIOSETC |
tchars |
установить параметры терминала из структуры данных |
The sgttyb
структура данных
[ редактировать ]
Одной из структур данных, используемых терминальными системными вызовами, является sgttyb
структура, определение которой на языке программирования C выглядит следующим образом: [14]
struct sgttyb {
char sg_ispeed ; // Input speed
char sg_ospeed ; // Output speed
char sg_erase ; // Erase character
char sg_kill ; // Kill character
char sg_flags ; // Control 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]
The sg_erase
и sg_kill
поля были просто значениями символов «стирания» и «уничтожения» соответственно, по умолчанию использовались значения (ASCII) для ' # ' и ' @ ' соответственно. [14]
The sg_flags
В поле указаны различные флаги управления вводом и выводом, как показано в следующей таблице.
символ | восьмеричное значение | описание |
---|---|---|
BSDELAY |
0100000 | задержка при написании BS персонажи |
BS0 |
0000000 | |
BS1 |
0100000 | |
VTDELAY |
0040000 | задержка при написании ВТ и ФФ персонажи |
FF0 |
0000000 | |
FF1 |
0040000 | |
CRDELAY |
0030000 | задержка при написании CR- персонажи |
CR0 |
0000000 | |
CR1 |
0010000 | |
CR2 |
0020000 | |
CR3 |
0030000 | |
TBDELAY |
0006000 | задержка при написании табуляции Символы XTABS технически не определяет задержку, а скорее приводит к преобразованию символов табуляции в последовательности из одного или нескольких пробелов.
|
TAB0 |
0000000 | |
TAB1 |
00002000 | |
TAB2 |
0004000 | |
XTABS |
0006000 | |
NLDELAY |
0001400 | задержка при написании НЧ- персонажи |
NL0 |
0000000 | |
NL1 |
00000400 | |
NL2 |
0001000 | |
NL3 |
0001400 | |
EVENP |
0000200 | даже паритет |
ODDP |
0000100 | нечетная четность |
RAW |
0000040 | «сырой» режим |
CRMOD |
0000020 | режим отображения возврата каретки ( CR отображается на НЧ на входе и оба ЧР и НЧ превращаются в CR + НЧ на выходе) |
ECHO |
0000010 | локальная эмуляция эха драйвером терминала |
LCASE |
0000004 | преобразовать верхний регистр в нижний регистр при вводе |
CBREAK |
0000002 | режим "cbreak" |
TANDEM |
0000001 | включить управление потоком через модем |
The tchars
структура данных
[ редактировать ]
Одной из структур данных, используемых терминальными системными вызовами, является tchars
структура, определение которой на языке программирования C выглядит следующим образом: [16]
struct tchars {
char t_intrc ; // Interrupt
char t_quitc ; // Quit
char t_startc ; // Start
char t_stopc ; // Stop
char t_eofc ; // End of File
char t_brkc ; // Break (alternative to hardwired LF character with same effect)
} ;
Значениями этих полей были значения различных программно настраиваемых специальных символов. Значение -1 в любом поле отключало его распознавание драйвером терминала. [16]
Ссылки
[ редактировать ]- ^ Борн 1983 , с. 8.
- ^ Перейти обратно: а б Борн 1983 , с. 130–131.
- ^ Перейти обратно: а б Борн 1983 , с. 287.
- ^ Перейти обратно: а б Кристиан 1988 , с. 26.
- ^ Леффлер и др. 1989 , с. 262.
- ^ Борн 1983 , с. 132–133.
- ^ Леффлер и др. 1989 , с. 259–260.
- ^ Перейти обратно: а б с Борн 1983 , с. 288.
- ^ Перейти обратно: а б Леффлер и др. 1989 , с. 260.
- ^ Борн 1983 , с. 132.
- ^ Борн 1983 , с. 130.
- ^ Борн 1983 , с. 133.
- ^ Кристиан 1988 , с. 393.
- ^ Перейти обратно: а б с Борн 1983 , с. 286.
- ^ Злотник 1991 , с. 166.
- ^ Перейти обратно: а б Борн 1983 , с. 289.
Библиография
[ редактировать ]- Борн, Стивен Р. (1983). Система UNIX . Международная серия по информатике. Аддисон-Уэсли. ISBN 978-0-201-13791-0 .
- Кристиан, Кааре (1988). Операционная система UNIX (2-е изд.). Джон Уайли и сыновья. ISBN 978-0-471-84781-6 .
- Леффлер, Сэмюэл Дж.; МакКьюсик, Маршалл Кирк ; Карелс, Майкл Дж.; Квартерман, Джон С. (1989). «Терминальное обслуживание». Проектирование и внедрение операционной системы 4.3BSD UNIX . Серия Аддисона-Уэсли по информатике. Аддисон-Уэсли. ISBN 978-0-201-06196-3 .
- Злотник, Фред (1991). «Управление терминальными устройствами». Стандарт POSIX.1: руководство программиста . Паб Бенджамин / Каммингс. компании ISBN 978-0-8053-9605-8 .