Интерфейс терминала POSIX - POSIX terminal interface

В Интерфейс терминала POSIX является обобщенной абстракцией, включающей как Интерфейс прикладного программирования для программ и набор поведенческих ожиданий для пользователей Терминал, как это определено POSIX стандарт и Единая спецификация Unix. Это историческое развитие терминальных интерфейсов BSD версии 4 и Седьмое издание Unix.

Общие основные концепции

Аппаратное обеспечение

В системах Unix множество устройств ввода-вывода рассматриваются как «терминалы».[1][2] К ним относятся:

Терминальный интеллект и возможности

Интеллект: терминалы тупые, а не умные

В отличие от мэйнфрейма и миникомпьютера[нужна цитата ] современников, оригинальная система Unix была разработана исключительно для тупой терминалы, и это остается так и сегодня.[6] Терминал - это ориентированное на символы устройство, состоящее из потоков символов, полученных от устройства и отправленных на него.[6][7] Хотя потоки символов структурированы, включая управляющие символы, коды выхода, и специальные символы, протокол ввода-вывода не структурирован, как протокол ввода-вывода умная, или же разумный, терминалы. Спецификации формата поля отсутствуют. Нет блочной передачи целых экранов (форм ввода) входных данных.

Напротив, мэйнфреймы и миникомпьютеры в закрытых архитектурах обычно используют Блочно-ориентированные терминалы.

Возможности: terminfo, termcap, curses и др.

«Возможности» терминала включают в себя различные немые функции терминала, которые выходят за рамки того, что доступно с чистого телетайпа, которые программы могут использовать. Они (в основном) содержат escape-коды, которые могут быть отправлены на терминал или получены от него. Управляющие коды, отправляемые на терминал, выполняют различные функции, которые терминал CRT (или программный эмулятор терминала) может выполнять, но не телетайп, например, перемещение курсора терминала в положение на экране, очистка и прокрутка всего или частей экрана. , включение и выключение подключенных принтеров, программируемые функциональные клавиши, изменение цвета и атрибутов дисплея (например, обратное видео ) и установка отображаемых строк заголовков. Коды выхода, полученные от терминала, обозначают такие вещи, как функциональная клавиша, клавишу со стрелкой, и другие специальные нажатия клавиш (домашний ключ, конечный ключ, ключ помощи, Клавиша PgUp, Клавиша PgDn, вставить ключ, удалить ключ, и так далее).[8][9]

Эти возможности закодированы в базах данных, которые настраиваются системным администратором и доступны из программ через terminfo библиотека (которая заменяет старую termcap библиотека), на которой, в свою очередь, построены библиотеки, такие как проклятия и ncurses библиотеки. Прикладные программы используют возможности терминала для предоставления текстовые пользовательские интерфейсы с окнами, диалоговыми окнами, кнопками, метками, полями ввода, меню и т. д.[10][11]

Управление переменными среды: СРОК и другие.

Конкретный набор возможностей для терминала, который использует (распознающая терминал) программа ввода и вывода, получается из базы данных, а не встроен в программы и библиотеки, и управляется СРОК переменная окружения (и, необязательно для библиотек termcap и terminfo, TERMCAP и ТЕРМИНФО переменные среды соответственно).[10] Эта переменная устанавливается любым терминальный монитор Программа порождает программы, которые затем используют этот терминал для ввода и вывода, а иногда и явно. Например:

  • В Getty программа (или эквивалент) устанавливает СРОК переменная среды в соответствии с системной базой данных (по-разному inittab или файлы конфигурации для ttymon или же запуск программ), определяя, какие локальные терминалы подключены к каким последовательным портам и какие типы терминалов предоставляются локальными виртуальными терминалами или локальной системной консолью.
  • Пользователь коммутируемого доступа на удаленном терминале не использует тип терминала, который система обычно ожидает от этой коммутируемой линии, и поэтому вручную устанавливает СРОК переменная среды сразу после входа в правильный тип. (Чаще тип терминала, установленный программой getty для коммутируемой линии, который системный администратор определил как наиболее часто используемый коммутируемыми пользователями с удаленными терминалами, совпадает с типом терминала, используемым коммутируемым пользователем и этому пользователю не нужно изменять тип терминала.)
  • В SSH серверный демон (или его аналог, например rlogin демон) устанавливает СРОК переменная окружения к тому же типу терминала, что и клиент SSH.[12]
  • Программный эмулятор терминала, используя псевдотерминал, устанавливает СРОК переменная окружения, чтобы указать тип эмулируемого терминала. Эмулируемые терминалы часто не совсем соответствуют реальному терминальному оборудованию, а у эмуляторов терминала есть имена типов, предназначенные для их использования. Программа xterm (по умолчанию) устанавливает xterm в качестве типа терминала, например.[13] В Экран GNU наборы программ экран как тип терминала.

Контроль работы

Терминалы предоставляют средства контроля работы. В интерактивном режиме пользователь на терминале может отправлять управляющие символы, которые приостанавливают текущее выполняемое задание, возвращаясь к интерактивной оболочке управления заданием, которая породила задание, и может запускать команды, которые переводят задания в «фоновый режим» или переключают другое, фоновое задание. на передний план (при необходимости отключив его).[14][15]

Линейные дисциплины

Строго говоря, в Unices терминальное устройство включает в себя базовый драйвер устройства tty, отвечающий за физический контроль оборудования устройства с помощью инструкций ввода-вывода и обработку запросов прерывания устройства для ввода и вывода символов, а также линейная дисциплина. Линейная дисциплина не зависит от реального оборудования устройства, и такая же линейная дисциплина может использоваться для конечный концентратор устройство, отвечающее за несколько управляющих терминалов как за псевдотерминал. Фактически, линейная дисциплина (или, в случае BSD, AIX и других систем, линия дисциплины) одинаковы для всех оконечных устройств. Именно дисциплина линии отвечает за локальное эхо, редактирование строки, обработку режимов ввода, обработку режимов вывода и отображение символов. Все эти вещи не зависят от реального оборудования, они работают так же, как и в простых абстракциях, предоставляемых драйверами устройств tty: передача символа, получение символа, установка различных состояний оборудования.[16][17]

В Седьмое издание Unix, BSD системы и производные, включая macOS, и Linux, каждое оконечное устройство может переключаться между несколькими линейными дисциплинами.[18] В AT&T ПОТОКИ В системе линейные дисциплины - это модули STREAMS, которые можно вставлять и извлекать из стека ввода-вывода STREAMS.[19]

История

Терминальный интерфейс POSIX является производным от терминальных интерфейсов различных систем Unix.

Ранние версии Unix: седьмое издание Unix

Терминальный интерфейс, предоставляемый Unix 32V и Seventh Edition Unix, а также представленный BSD версии 4 как старый драйвер терминала, был простым, в основном ориентированным на телетайпы в качестве терминалов. Ввод вводился построчно, причем драйвер терминала в операционной системе (а не сами терминалы) предоставлял простые возможности редактирования строки. Ядро поддерживало буфер, в котором происходило редактирование. Приложения, читающие ввод терминала, получат содержимое буфера только тогда, когда возвращаться На терминале была нажата клавиша для завершения редактирования строки. В @ Ключ, отправленный с терминала в систему, стирает ("уничтожает") все текущее содержимое буфера редактирования и обычно отображается как '@', за которым следует новая строка, чтобы переместить позицию печати на новую пустую строку. В # Ключ, отправленный с терминала в систему, стирает последний символ с конца буфера редактирования и обычно отображается как '#', который пользователи должны будут распознать как обозначающий "стирание" предыдущего символа (телетайпы физически не способны стирать символы после того, как они были напечатаны на бумаге).[20][21][22][23][18]

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

Три режима ввода были:

линейный режим (также называемый "приготовленным" режимом)

В линейном режиме дисциплина линии выполняет все функции редактирования строки и распознает управляющие символы «прерывание» и «выход» и преобразует их в сигналы, отправляемые процессам. Прикладные программы, считывающие с терминала, получают целые строки после того, как редактирование строки было завершено пользователем, нажав клавишу возврата.[21][25]

c режим прерывания

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

сырой режим
необработанный режим - это другой из двух режимов одновременного ввода символов. Дисциплина строки не выполняет редактирование строки, а управляющие последовательности для функций редактирования строки и различных специальных символов («прерывание», «выход» и управление потоком) обрабатываются как обычный ввод символов. Прикладные программы, считывающие с терминала, получают символы немедленно и получают весь символьный поток без изменений, так же, как он поступил с самого терминального устройства.[28][26][27]

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

BSD: появление контроля над заданиями

Вместе с BSD Unices пришли контроль работы, а новый драйвер терминала с расширенными возможностями.[18] Эти расширения содержат дополнительные (опять же программно изменяемые) специальные символы:

  • Символы «приостановить» и «отложить приостановку» (по умолчанию Контроль+Z и Контроль+Y - ASCII SUB и ЭМ ) вызвал генерацию нового SIGTSTP сигнал для процессов в группе управляющих процессов терминала.[27]
  • Символы "стирание слова", "следующий буквально" и "повторная печать" (по умолчанию Контроль+W, Контроль+V, и Контроль+р - ASCII ETB, SYN, и DC2 ) выполнял дополнительные функции редактирования строки. «стирание слова» стирает последнее слово в конце буфера редактирования строки. "literal next" позволяет ввести любой специальный символ в буфер редактирования строки (функция, доступная, что несколько неудобно, в Seventh Edition Unix через символ обратной косой черты). «повторная печать» заставляла дисциплину строки повторно печатать текущее содержимое буфера редактирования строки на новой строке (полезно, когда другой, фоновый процесс генерировал выходные данные, которые смешались с редактированием строки).[27]

Программный интерфейс для запроса и изменения всех этих дополнительных режимов и управляющих символов все еще оставался ioctl () системный вызов, который его создатели (Leffler et al. 1989 г., п. 262) описывается как «довольно загроможденный интерфейс». Все оригинальные функции Unix седьмого издания были сохранены, а новые функции были добавлены с помощью дополнительных ioctl () коды операций, что привело к явному росту программного интерфейса, в котором функциональность частично дублировалась.[31]

Система III и Система V

Система III представил новый интерфейс программирования, который объединил отдельные ioctl () операции для получения и установки флагов, а также для получения и установки управляющих символов в вызовах, которые использовали Термио структура для хранения как флагов, так и управляющих символов, которая может получить их за одну операцию и установить их за одну операцию. Он также разделил некоторые из флагов интерфейса Seventh Edition на несколько отдельных флагов и добавил некоторые дополнительные возможности, хотя он не поддерживал управление заданиями или усовершенствования готового режима 4BSD.[32] Например, он заменил режимы «приготовленный», «cbreak» и «сырой» седьмого издания другими абстракциями. Распознавание символов, генерирующих сигнал, не зависит от режима ввода, и есть только два режима ввода: канонический и неканонический. (Это позволяет использовать режим терминального ввода, отсутствующий в седьмом издании и BSD: канонический режим с отключенной генерацией сигнала.)

Преемники Системы III, в том числе Система V, использовал тот же интерфейс.

POSIX: консолидация и абстракция

Одной из основных проблем, которую решил стандарт POSIX с помощью определения общего терминального интерфейса, было множество программных интерфейсов. Хотя ко времени введения стандарта поведение терминалов было довольно единообразным от системы к системе, большинство Unix приняли понятия линейной дисциплины и возможности управления заданиями BSD, программный интерфейс для терминалов через ioctl () системный вызов был беспорядком. Разные устройства поставляются разные ioctl () операции с разными (символическими) именами и разными флагами. Переносимый исходный код должен был содержать значительный объем условной компиляции, чтобы учесть различия между программными платформами, даже если все они условно были Unix.[33]

Стандарт POSIX заменяет ioctl () систему целиком, с набором библиотечных функций (которые, конечно, могут быть реализовано под прикрытием через платформу ioctl () операции) со стандартизованными именами и параметрами. В Термио структура данных System V Unix использовалась в качестве шаблона для POSIX Термиос структура данных, поля которой в основном не изменились, за исключением того, что теперь они использовали псевдонимы типов данных для указания полей, что позволяло разработчикам легко переносить их на несколько архитектур процессоров, вместо того, чтобы явно требовать беззнаковый короткий и char типы данных языков программирования C и C ++ (размеры которых могут быть неудобными на некоторых архитектурах процессоров).[33][34]

POSIX также представил поддержку управления заданиями, с Термиос структура, содержащая символы приостановки и задержки-приостановки в дополнение к управляющим символам, поддерживаемым System III и System V. Она не добавляла никаких расширений готового режима из BSD, хотя SunOS 4.x, System V Выпуск 4, Солярис, HP-UX, AIX, более новые BSD, macOS, и Linux реализовали их как расширения к Термиос.

Что определяет стандарт

Управляющие терминалы и группы процессов

Каждый процесс в системе есть либо один управляющий терминал, или никакого управляющего терминала. Процесс наследует свой управляющий терминал от своего родителя, и единственные операции над процессом - это получение управляющего терминала процессом, у которого нет управляющего терминала, и отказ от него процессом, у которого есть управляющий терминал.[33]

Не определен переносимый способ получения управляющего терминала, метод определяется реализацией. Стандарт определяет O_NOCTTY флаг для открыто() системный вызов, что является способом предотвращение что в противном случае является обычным способом получения управляющего терминала (процесс без управляющего терминала открыто()s файл терминального устройства, который еще не является управляющим терминалом для какого-либо другого процесса, без указания O_NOCTTY флаг[35]), но оставляет его обычную семантику необязательной.

Каждый процесс также является членом группы процессов. Каждое оконечное устройство записывает группу процессов, которая называется его группа процессов переднего плана. Группы процессов управляют доступом к терминалам и доставкой сигналов. Сигналы, генерируемые терминалом, отправляются всем процессам, которые являются членами группы процессов переднего плана терминала. читать() и записывать() Операции ввода-вывода на терминале, выполняемые процессом, который не является членом группы процессов переднего плана терминала, будут и могут опционально (соответственно) вызывать сигналы (SIGTTIN и SIGTTOU соответственно) для отправки вызывающему процессу. Различные библиотечные функции, изменяющие режим терминала, ведут себя так же, как записывать(), за исключением того, что они всегда генерируют сигналы, даже если эта функция отключена для записывать() сам.[36][37]

В Термиос структура данных

Структура данных, используемая всеми вызовами библиотеки терминала, - это Термиос структура,[38] чье определение языков программирования C и C ++ выглядит следующим образом:[34]

структура Термиос {    tcflag_t c_iflag ;  // Режимы ввода    tcflag_t c_oflag ;  // Режимы вывода    tcflag_t c_cflag ;  // Режимы управления    tcflag_t c_lflag ;  // Локальные режимы    cc_t c_cc[NCCS] ;   // Управляющие символы} ;

Порядок полей в Термиос структура не определена, и реализациям разрешено добавлять нестандартные поля.[34] Действительно, реализации должны добавлять нестандартные поля для записи входных и выходных скоростей передачи. Они записываются в структуре в форме, определяемой реализацией, и доступ к ним осуществляется через функции доступа, а не путем прямого управления значениями полей, как в случае со стандартизованными полями структуры.[39]

Псевдонимы типов данных tcflag_t и cc_t, а также символическая константа NCCS и целый набор символических констант для различных флагов режима, имен управляющих символов и скоростей передачи данных, все они определены в стандартном заголовке. termios.h. (Это не следует путать с заголовком с таким же названием termio.h из Системы III и Системы V, которая определяет аналогичный Термио структура и множество одноименных символических констант. Этот интерфейс специфичен для System III и System V, и код, который его использует, не обязательно будет переносимым для других систем.)[40]

Поля структуры (вкратце, подробнее см. В основной статье[требуется разъяснение ]):

c_iflag
флаги режима ввода для контроля четности ввода, перевод новой строки ввода, модем управление потоком, 8-битная чистота, и ответ на (последовательный порт) состояние "разрыва"[34]
c_oflag
флаги режима вывода для управления постобработкой вывода, определяемой реализацией, переводом вывода новой строки и задержками вывода после отправки различных управляющих символов[41][27]
c_cflag
флаги управления оборудованием терминала для управления фактическим оконечным устройством, а не дисциплиной линии: количество бит в символе, тип четности, управление зависанием и управление потоком последовательной линии[42]
c_lflag
флаги локального управления для управления дисциплиной линии, а не оборудованием терминала: канонический режим, режимы эха, распознавание и обработка символов генерации сигнала, а также включение генерации SIGTTOU сигнал от записывать() системный вызов[39]

Функции библиотеки (вкратце, подробнее см. В основной статье[требуется разъяснение ]):

tcgetattr ()
запросить текущие настройки атрибутов терминального устройства в Термиос структура[43]
tcsetattr ()
установить текущие настройки атрибутов оконечного устройства из Термиос структура, опционально ожидающая вывода из очереди для слива и очистки ввода из очереди[43]
cfgetispeed ()
запросить входную скорость передачи данных из полей, определенных реализацией в Термиос структура[44]
cfgetospeed ()
запросить выходную скорость передачи из полей, определенных реализацией в Термиос структура[44]
cfsetispeed ()
установить входную скорость передачи данных в полях, определенных реализацией в Термиос структура[44]
cfsetospeed ()
установить выходную скорость передачи в полях, определяемых реализацией, в Термиос структура[44]
tcsendbreak ()
отправить сигнал обрыва модема на терминал последовательного устройства[45]
tcdrain ()
подождите, пока выйдет из очереди[45]
tcflush ()
отменить ввод из очереди[45]
tcflow ()
изменить управление потоком[45]
tcgetpgrp ()
запросить группу процессов переднего плана терминала[46]
tcsetpgrp ()
установить группу процессов переднего плана терминала[46]

Специальные символы

Программно изменяемые специальные символы[47][44]
ПолесмыслПолучено читать()Примечания
c_cc [VEOF]конец файлаНетОбработано только в каноническом режиме редактирования строки
c_cc [VEOL]конец линиидаОбработано только в каноническом режиме редактирования строки
c_cc [VERASE]"стереть"НетОбработано только в каноническом режиме редактирования строки
c_cc [VKILL]"убийство"НетОбработано только в каноническом режиме редактирования строки
c_cc [VINTR]"прерывать"НетХарактер генерации сигнала независимо от режима ввода
c_cc [VQUIT]"покидать"НетХарактер генерации сигнала независимо от режима ввода
c_cc [VSUSP]"приостановить"НетХарактер генерации сигнала независимо от режима ввода
c_cc [VSTOP]"остановка"НетСимвол управления потоком модема независимо от режима ввода
c_cc [VSTART]"Начните"НетСимвол управления потоком модема независимо от режима ввода

В c_cc [] член массива Термиос структура данных определяет все (программно изменяемые) специальные символы. Индексы в массиве представляют собой символьные константы, по одной для каждого специального типа символа, как в таблице справа. (Еще две записи в массиве относятся к обработке ввода в неканоническом режиме и обсуждаются ниже.)[43]

Непрограммно изменяемые специальные символы: перевод строки (ASCII LF) и возврат каретки (ASCII CR).[47]

Обработка ввода

Обработка ввода определяет поведение читать() системный вызов на оконечном устройстве, а также характеристики редактирования и генерации сигналов дисциплины линии. В отличие от седьмого издания Unix и BSD версии 4 и, как и в случае с System III и System V, редактирование строки работает в одном из двух режимов: каноническом режиме и неканоническом режиме. Основное различие между ними состоит в том, когда, с точки зрения требований блокирования / неблокирования читать() системный вызов (указанный с помощью O_NONBLOCK флаг на дескриптор файла через открыто() или же fcntl ()), данные «доступны для чтения».[48]

Обработка в каноническом режиме

В каноническом режиме данные накапливаются в буфере редактирования строки и не становятся «доступными для чтения» до тех пор, пока редактирование строки не будет прекращено пользователем (на терминале), отправившим сообщение символ разделителя строк. Символы-разделители строк являются специальными символами, и они конец файла, конец линии, и перевод строки (ASCII LF). Первые два настраиваются программно, а последний фиксирован. Последние два включены в буфер редактирования строки, а первый - нет.[49]

Точнее, в буфере редактирования строк накапливается ноль или более строк, разделенных разделителями строк (которые могут или не могут быть отброшены один раз читать() приходит к их чтению), а редактирование строки работает с той частью буфера редактирования строки, которая следует за последним (если есть) разделителем строк в буфере. Так, например, символ «стирания» (какой бы он ни был запрограммирован) удалит последний символ в строковом буфере только до (но не включая) предыдущего разделителя строки.[49]

Обработка в неканоническом режиме

В неканоническом режиме данные накапливаются в буфере (который может быть или не быть буфером редактирования строки - некоторые реализации имеют отдельные очереди «обработанный ввод» и «необработанный ввод») и становятся «доступными для чтения» в соответствии со значениями. двух входных управляющих параметров c_cc [MIN] и c_cc [ВРЕМЯ] члены Термиос структура данных. Оба значения беззнаковые (потому что cc_t должен быть псевдонимом для беззнакового типа). Первый определяет минимальное количество символов, а второй указывает тайм-аут в десятых долях секунды.[50] Есть четыре возможности:

c_cc [ВРЕМЯ] и c_cc [MIN] оба равны нулю
В этом случае данные в буфере сразу же «доступны для чтения», и читать() немедленно возвращается с любыми данными в буфере (потенциально возвращает ноль, если нет доступных данных).[51]
c_cc [ВРЕМЯ] не равно нулю и c_cc [MIN] ноль
В этом случае данные в буфере «доступны для чтения» по истечении заданного тайм-аута, таймер срабатывает при запуске читать() системный вызов, или если получен один символ. Другими словами, читать() ожидает в течение максимального указанного общего времени и может вернуть нулевые данные, а также возвращает любые данные, как только они будут получены.[51]
c_cc [ВРЕМЯ] равен нулю и c_cc [MIN] ненулевой
В этом случае данные в буфере «доступны для чтения» после того, как указанное количество символов было получено в буфере. Другими словами, читать() ожидает минимального объема данных (который может быть больше, чем то, что вызывающий абонент готов прочитать в системном вызове), не возвращает нулевые данные и может ждать бесконечно.[51]
c_cc [ВРЕМЯ] и c_cc [MIN] оба ненулевые
В этом случае данные в буфере «доступны для чтения» после того, как указанное количество символов было получено в буфере или истекло время ожидания с момента ввода последнего символа. Для самого первого символа таймаута нет. Другими словами, читать() ожидает минимального количества данных (которое может быть больше, чем то, что вызывающий абонент готов прочитать в системном вызове), не возвращает нулевые данные, может ждать бесконечно, но не будет ждать дольше указанного тайм-аута, если хотя бы один символ находится в буфере для чтения.[51]

Обработка вывода

Обработка вывода практически не изменилась по сравнению с ее корнями в System III / System V. Флаги управления режимом вывода определяют различные варианты:

  • Возврат каретки может быть вставлен перед каждым символом перевода строки, чтобы преобразовать семантику новой строки Unix в семантику ASCII, которую ожидают многие терминалы.[27][22]
  • Терминалам может быть предоставлено время для выполнения различных управляющих кодов, которые (на телетайпе или аналогичном) могут приводить к физическим движениям каретки, которые могут занять значительное (с точки зрения компьютера) количество времени, например, обратные пробелы, горизонтальные табуляции, каретка возврат, перевод страницы и перевод строки.[27][52]

Примечания

  1. ^ а б c Кристиан 1988, п. 11.
  2. ^ Борн 1983, п. 6.
  3. ^ Гроб 1991, п. 820.
  4. ^ Гроб 1991, п. 23–24.
  5. ^ Leffler et al. 1989 г., п. 259.
  6. ^ а б Гроб 1991, п. 24.
  7. ^ Leffler et al. 1989 г., п. 37–38.
  8. ^ Афзал 2008, п. 419.
  9. ^ Фриш 2002, п. 770.
  10. ^ а б Гроб 1991, п. 115.
  11. ^ Гроб 1991, п. 372.
  12. ^ Гроб 1991, п. 779.
  13. ^ Гроб 1991, п. 751–752.
  14. ^ Leffler et al. 1989 г., п. 265.
  15. ^ Leffler et al. 1989 г., п. 103.
  16. ^ Leffler et al. 1989 г., п. 38.
  17. ^ Leffler et al. 1989 г., п. 260–261.
  18. ^ а б c Leffler et al. 1989 г., п. 262.
  19. ^ Кристиан 1988, п. 395.
  20. ^ Борн 1983, п. 8.
  21. ^ а б Борн 1983, п. 130–131.
  22. ^ а б Борн 1983, п. 287.
  23. ^ а б Кристиан 1988, п. 26.
  24. ^ Борн 1983, п. 132–133.
  25. ^ Leffler et al. 1989 г., п. 259–260.
  26. ^ а б Борн 1983, п. 288.
  27. ^ а б c d е ж грамм Leffler et al. 1989 г., п. 260.
  28. ^ Борн 1983, п. 132.
  29. ^ Борн 1983, п. 133.
  30. ^ Кристиан 1988, п. 393.
  31. ^ Leffler et al. 1989 г., п. 262–263.
  32. ^ "Источник справочной страницы System III tty (4)". Получено 5 октября, 2012.
  33. ^ а б c Злотник 1991, п. 157.
  34. ^ а б c d Злотник 1991, п. 163.
  35. ^ Борн 1983, п. 130.
  36. ^ Злотник 1991, п. 158.
  37. ^ Злотник 1991, п. 173–174.
  38. ^ Злотник 1991, п. 162.
  39. ^ а б Злотник 1991, п. 166.
  40. ^ Злотник 1991, п. 162–163.
  41. ^ Злотник 1991, п. 164.
  42. ^ Злотник 1991, п. 165.
  43. ^ а б c Злотник 1991, п. 167.
  44. ^ а б c d е Злотник 1991, п. 169.
  45. ^ а б c d Злотник 1991, п. 172.
  46. ^ а б Злотник 1991, п. 174.
  47. ^ а б Злотник 1991, п. 159.
  48. ^ Злотник 1991, п. 160.
  49. ^ а б Злотник 1991, п. 160–161.
  50. ^ Злотник 1991, п. 161.
  51. ^ а б c d Злотник 1991, п. 161–162.
  52. ^ Борн 1983, п. 287–288.

Источники

дальнейшее чтение