Терминальный интерфейс Unix седьмого издания

редактировать

Терминальный интерфейс Unix седьмого издания является обобщенной абстракцией, включающей приложение программный интерфейс для программ и набор поведенческих ожиданий для пользователей терминала, который исторически доступен в Seventh Edition Unix. Его в значительной степени вытеснил интерфейс терминала POSIX.

Содержание
  • 1 Основные понятия и обзор
    • 1.1 Режимы ввода
    • 1.2 Управляющие терминалы
  • 2 Интерфейс прикладного программирования
    • 2.1 ioctl () операции
    • 2.2 Структура данных sgttyb
    • 2.3 Структура данных tchars
  • 3 Ссылки
  • 4 Библиография
Основные понятия и обзор

Терминальный интерфейс, предоставляемый Seventh Edition Unix и UNIX / 32V, также представленный BSD версии 4 как старый драйвер терминала, был простым, в основном ориентированным на телетайпы в качестве терминалов. Ввод вводился построчно, причем драйвер терминала в операционной системе (а не сами терминалы) предоставлял простые возможности редактирования строки. Ядро поддерживало буфер, в котором происходило редактирование. Приложения, читающие ввод с терминала, получат содержимое буфера только тогда, когда на терминале была нажата клавиша returnдля завершения редактирования строки. Клавиша @, отправленная с терминала в систему, стирает («уничтожает») все текущее содержимое буфера редактирования и обычно отображается как символ '@', за которым следует последовательностью новой строки, чтобы переместить позицию печати на новую пустую строку. Клавиша #, отправленная с терминала в систему, стирает последний символ с конца буфера редактирования и обычно отображается как символ '#', который пользователи должны распознаваться как обозначающие «стирание» предыдущего символа (телетайпы физически не способны стирать символы после того, как они были напечатаны на бумаге).

С точки зрения программирования, оконечное устройство должно было передавать и получать скорости передачи, символы «стирания» и «уничтожения» (которые выполняли редактирование строки, как объяснено), символы «прерывание» и «выход» (генерирование сигналов для всех процессы, для которых терминал был управляющим терминалом), символы «начало» и «стоп» (используемые для программного управления потоком ), символ «конец файла» (действующий как возврат каретки, за исключением отбрасываемых из буфер с помощью системного вызова read ()и, следовательно, потенциально вызывающий возврат результата нулевой длины) и различные флаги режима, определяющие, er локальное эхо было эмулировано драйвером терминала ядра, было ли включено управление потоком модема, продолжительность различных задержек вывода, отображение символа возврата каретки и три режима ввода.

Режимы ввода

Три режима ввода для терминалов в седьмой редакции Unix были:

линейный режим (также называемый "приготовленным" режимом)
В линейном режиме дисциплина линии выполняет все функции редактирования строки и распознает управляющие символы «прерывание» и «выход» и преобразует их в сигналы, отправляемые процессам. Прикладные программы, считывающие с терминала, получают целые строки после того, как редактирование строки было завершено пользователем, нажав клавишу возврата.
cbreak mode
cbreak mode - это один из двух посимвольных режимов. (Стивен Р. Борн в шутку назвал его (Bourne 1983, p. 288) «полу-приготовленным» и, следовательно, «редким» режимом.) Линия дисциплины не выполняет строчку. редактирования, а управляющие последовательности для функций редактирования строки обрабатываются как обычный ввод символов. Прикладные программы, считывающие с терминала, получают символы немедленно, как только они становятся доступными для чтения во входной очереди. Однако управляющие символы «прерывание» и «выход», а также символы управления потоком модема по-прежнему обрабатываются особым образом и удаляются из входного потока.
необработанный режим
необработанный режим - это другой из двух режимов "символ за раз". Дисциплина строки не выполняет редактирование строки, а управляющие последовательности для функций редактирования строки и различных специальных символов («прерывание», «выход» и управление потоком) обрабатываются как обычный ввод символов. Прикладные программы, считывающие с терминала, получают символы немедленно и получают весь символьный поток без изменений, так же, как он поступил с самого терминального устройства.

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

Управление терминалами

В седьмой редакции Unix не было терминала управления заданиями, и группа процессов считалась не такой, как считается быть в наши дни.

Каждый процесс в системе имел либо один управляющий терминал, либо вообще не имел управляющего терминала. Процесс наследует свой управляющий терминал от своего родителя. Управляющий терминал был получен, когда процесс без управляющего терминала open ()получил файл терминального устройства, который еще не является управляющим терминалом для какого-либо другого процесса. Все процессы с одним и тем же управляющим терминалом входили в одну группу процессов.

Интерфейс прикладного программирования

Программным интерфейсом для запроса и изменения всех этих режимов и управляющих символов был ioctl ()системный вызов. (Это заменило системные вызовы stty ()и gtty ()в шестой редакции Unix.) Хотя символы «стирания» и «уничтожения» можно было изменить по сравнению с их значениями по умолчанию #и @, в течение многих лет после инерции разработки седьмого издания означало, что они были предустановленными значениями по умолчанию в драйверах терминальных устройств и во многих системах Unix, которые изменяли настройки терминального устройства только как часть процесса входа в систему, в сценариях входа в систему, которые запускались после того, как пользователь ввел имя пользователя и пароль, любые ошибки в запросах входа в систему и пароля должны были быть исправлены с использованием исторических ключевых символов редактирования, унаследованных от терминалов телетайпа.

символические константы, значения которых были фиксированы и определены, а также определения структур данных программного интерфейса были определены в системном заголовке sgtty.h.

ioctl ()operations

Операции ioctl ()были следующими:

ioctl ()операции для оконечных устройств
symbolструктура poi связано с третьим аргументомописание
TIOGETPsgttybзапросить параметры терминала в структуре данных
TIOSETPsgttybустановить параметры терминала из структуры данных, опустошая сначала весь ожидающий вывод и очищающий ввод в очереди
TIOSETNsgttybзадают параметры терминала из структуры данных, не дожидаясь и не истощая
TIOCEXCLни одинвключить «исключительное использование» "режим
TIOCNXCLнетвыключить режим" исключительного использования "
TIOCHPCLнетвключить режим" зависания при последнем закрытии "
TIOCFLUSHнеточистить все очереди вывода и ввода
TIOGETCtcharsзапросить параметры терминала в структуру данных
TIOSETCtcharsустановить параметры терминала из структура данных

Структура данных sgttyb

Одной из структур данных, используемых системными вызовами терминала, является структура sgttyb, определение которой на языке программирования C выглядит следующим образом:

struct sgttyb {char sg_ispeed; // Ввод скорости char sg_ospeed; // Скорость вывода char sg_erase; // Удалить символ char sg_kill; // Убить персонажа char sg_flags; // Контрольные флаги};

В отличие от интерфейса терминала POSIX, интерфейс терминала Unix седьмой редакции записывал скорости ввода и вывода непосредственно в структуре данных.

Скорости ввода и вывода в sg_ispeedи sg_ospeedбыли полями, и были числами от 0 до 15, представленными символическими константами (в порядке возрастания) B0, B50, B75, B110, B134, B150, B200, B300, B600, B1200, B1800, B2400, B4800, B9600, EXTAи EXTB, где скорость передачи была такой же, как в названии (последние два - «внешний A» и «внешний B»). Установка нулевой скорости передачи вынудила драйвер терминала повесить модем (если терминал был модемом).

Поля sg_eraseи sg_killбыли просто значения символов для символов «стереть» и «уничтожить», соответственно, по умолчанию - значения (ASCII) для '#' и '@' соответственно.

sg_flagsполе определяет различные флаги управления вводом и выводом, как в следующей таблице.

флаги для поля sg_flagsструктуры данных sgtty
символвосьмеричное значениеописание
BSDELAY0100000задержка при записи BSсимволов
BS00000000
BS10100000
VTDELAY0040000задержка при записи символов VTи FF
FF00000000
FF10040000
CRDELAY0030000задержка при запись символов CR
CR00000000
CR10010000
CR20020000
CR30030000
TBDELAY0006000задержка при записи символов TAB. XTABSтехнически не определяет задержку, а заставляет символы табуляции преобразовываться в последовательности из одного или нескольких пробелов символы.
TAB00000000
TAB100002000
TAB20004000
XTABS0006000
NLDELAY0001400задержка при записи LFсимволы
NL00000000
NL100000400
NL20001000
NL30001400
EVENP0000200четность
ODDP0000100нечетная четность
RAW0000040«сырой» режим
CRMOD0000020режим отображения возврата каретки (CRсопоставляется с LFпри вводе, и оба CRи LFпревращаются в CR+LFна вывод)
ECHO0000010локальное эхо эмуляция драйвером терминала
LCASE0000004преобразовать верхний регистр в нижний регистр на входе
CBREAK0000002режим "cbreak"
TANDEM0000001включить управление потоком модема

tcharsструктура данных

One Структура данных, используемая системными вызовами терминала, - это структура tchars, определение которой на языке программирования C выглядит следующим образом:

struct tchars {char t_intrc; // Прерывание char t_quitc; // Выход из char t_startc; // Запускаем char t_stopc; // Остановить char t_eofc; // Конец файла char t_brkc; // Разрыв (альтернатива зашитому символу LF с таким же эффектом)};

Значения этих полей были значениями различных программно настраиваемых специальных символов. Значение -1 в любом поле отключило его распознавание драйвером терминала.

Ссылки
Библиография
Последняя правка сделана 2021-06-08 01:54:15
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте