Терминальный интерфейс Unix седьмого издания является обобщенной абстракцией, включающей приложение программный интерфейс для программ и набор поведенческих ожиданий для пользователей терминала, который исторически доступен в Seventh Edition Unix. Его в значительной степени вытеснил интерфейс терминала POSIX.
Терминальный интерфейс, предоставляемый Seventh Edition Unix и UNIX / 32V, также представленный BSD версии 4 как старый драйвер терминала, был простым, в основном ориентированным на телетайпы в качестве терминалов. Ввод вводился построчно, причем драйвер терминала в операционной системе (а не сами терминалы) предоставлял простые возможности редактирования строки. Ядро поддерживало буфер, в котором происходило редактирование. Приложения, читающие ввод с терминала, получат содержимое буфера только тогда, когда на терминале была нажата клавиша returnдля завершения редактирования строки. Клавиша @, отправленная с терминала в систему, стирает («уничтожает») все текущее содержимое буфера редактирования и обычно отображается как символ '@', за которым следует последовательностью новой строки, чтобы переместить позицию печати на новую пустую строку. Клавиша #, отправленная с терминала в систему, стирает последний символ с конца буфера редактирования и обычно отображается как символ '#', который пользователи должны распознаваться как обозначающие «стирание» предыдущего символа (телетайпы физически не способны стирать символы после того, как они были напечатаны на бумаге).
С точки зрения программирования, оконечное устройство должно было передавать и получать скорости передачи, символы «стирания» и «уничтожения» (которые выполняли редактирование строки, как объяснено), символы «прерывание» и «выход» (генерирование сигналов для всех процессы, для которых терминал был управляющим терминалом), символы «начало» и «стоп» (используемые для программного управления потоком ), символ «конец файла» (действующий как возврат каретки, за исключением отбрасываемых из буфер с помощью системного вызова read ()
и, следовательно, потенциально вызывающий возврат результата нулевой длины) и различные флаги режима, определяющие, er локальное эхо было эмулировано драйвером терминала ядра, было ли включено управление потоком модема, продолжительность различных задержек вывода, отображение символа возврата каретки и три режима ввода.
Три режима ввода для терминалов в седьмой редакции Unix были:
В терминальном интерфейсе POSIX эти режимы были заменены системой всего из двух режимов ввода : канонический и неканонический. Обработка специальных символов, генерирующих сигнал, в интерфейсе терминала POSIX не зависит от режима ввода и управляется отдельно.
В седьмой редакции Unix не было терминала управления заданиями, и группа процессов считалась не такой, как считается быть в наши дни.
Каждый процесс в системе имел либо один управляющий терминал, либо вообще не имел управляющего терминала. Процесс наследует свой управляющий терминал от своего родителя. Управляющий терминал был получен, когда процесс без управляющего терминала open ()
получил файл терминального устройства, который еще не является управляющим терминалом для какого-либо другого процесса. Все процессы с одним и тем же управляющим терминалом входили в одну группу процессов.
Программным интерфейсом для запроса и изменения всех этих режимов и управляющих символов был ioctl ()
системный вызов. (Это заменило системные вызовы stty ()
и gtty ()
в шестой редакции Unix.) Хотя символы «стирания» и «уничтожения» можно было изменить по сравнению с их значениями по умолчанию #и @, в течение многих лет после инерции разработки седьмого издания означало, что они были предустановленными значениями по умолчанию в драйверах терминальных устройств и во многих системах Unix, которые изменяли настройки терминального устройства только как часть процесса входа в систему, в сценариях входа в систему, которые запускались после того, как пользователь ввел имя пользователя и пароль, любые ошибки в запросах входа в систему и пароля должны были быть исправлены с использованием исторических ключевых символов редактирования, унаследованных от терминалов телетайпа.
символические константы, значения которых были фиксированы и определены, а также определения структур данных программного интерфейса были определены в системном заголовке sgtty.h
.
ioctl ()
operationsОперации ioctl ()
были следующими:
symbol | структура poi связано с третьим аргументом | описание |
---|---|---|
TIOGETP | sgttyb | запросить параметры терминала в структуре данных |
TIOSETP | sgttyb | установить параметры терминала из структуры данных, опустошая сначала весь ожидающий вывод и очищающий ввод в очереди |
TIOSETN | sgttyb | задают параметры терминала из структуры данных, не дожидаясь и не истощая |
TIOCEXCL | ни один | включить «исключительное использование» "режим |
TIOCNXCL | нет | выключить режим" исключительного использования " |
TIOCHPCL | нет | включить режим" зависания при последнем закрытии " |
TIOCFLUSH | нет | очистить все очереди вывода и ввода |
TIOGETC | tchars | запросить параметры терминала в структуру данных |
TIOSETC | tchars | установить параметры терминала из структура данных |
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
поле определяет различные флаги управления вводом и выводом, как в следующей таблице.
символ | восьмеричное значение | описание |
---|---|---|
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 | нечетная четность |
RAW | 0000040 | «сырой» режим |
CRMOD | 0000020 | режим отображения возврата каретки (CRсопоставляется с LFпри вводе, и оба CRи LFпревращаются в CR+LFна вывод) |
ECHO | 0000010 | локальное эхо эмуляция драйвером терминала |
LCASE | 0000004 | преобразовать верхний регистр в нижний регистр на входе |
CBREAK | 0000002 | режим "cbreak" |
TANDEM | 0000001 | включить управление потоком модема |
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 в любом поле отключило его распознавание драйвером терминала.