Терминальный интерфейс POSIX
— Терминальный интерфейс POSIX это обобщенная абстракция, включающая в себя как интерфейс прикладного программирования для программ, так и набор поведенческих ожиданий для пользователей терминала , как определено стандартом POSIX и Единой спецификацией Unix . Это историческое развитие терминальных интерфейсов BSD версии 4 и седьмого издания Unix .
Общие основные понятия
[ редактировать ]Аппаратное обеспечение
[ редактировать ]Множество устройств ввода-вывода рассматриваются в системах Unix как «терминалы». [1] [2] К ним относятся:
- последовательные устройства, подключенные через последовательный порт, такие как принтеры / телепринтеры , телетайпы , модемы, поддерживающие удаленные терминалы через коммутируемый доступ , и напрямую подключенные локальные терминалы [1] [3] [4] [5]
- адаптер дисплея и клавиатура , непосредственно встроенные в системный блок, вместе образуют локальную «консоль», которая может быть представлена пользователям и программам как один ЭЛТ-терминал или как несколько виртуальных терминалов. [1]
- программные эмуляторы терминала , такие как программы xterm , Konsole , GNOME Terminal и Terminal , а также сетевые серверы, такие как демон rlogin и демон SSH , которые используют псевдотерминалы.
Интеллект и возможности терминала
[ редактировать ]Интеллект: терминалы тупые, а не умные
[ редактировать ]В отличие от своего мэйнфрейма и миникомпьютера [ нужна ссылка ] По мнению современников, первоначальная система Unix была разработана исключительно для тупых терминалов, и так остается и сегодня. [6] Терминал представляет собой символьно-ориентированное устройство, содержащее потоки символов, получаемые от устройства и отправляемые на него. [6] [7] Хотя потоки символов структурированы и включают в себя управляющие символы , escape-коды и специальные символы, протокол ввода-вывода не структурирован так, как это было бы с протоколом ввода-вывода интеллектуальных или интеллектуальных терминалов. Спецификации формата поля отсутствуют. Нет блочной передачи целых экранов (форм ввода) входных данных.
Напротив, мэйнфреймы и миникомпьютеры с закрытой архитектурой обычно используют блочно-ориентированные терминалы .
Возможности: terminfo, termcap, Races и др.
[ редактировать ]«Возможности» терминала включают в себя различные функции тупого терминала, которые превосходят возможности обычного телетайпа, которые могут использовать программы. Они (в основном) содержат escape-коды, которые можно отправлять или получать с терминала. Escape-коды, отправляемые на терминал, выполняют различные функции, на которые способен ЭЛТ-терминал (или программный эмулятор терминала), но не телетайп, такие как перемещение курсора терминала в позиции на экране, очистка и прокрутка всего экрана или его частей. , включение и выключение подключенных принтеров, программируемые функциональные клавиши, изменение цветов и атрибутов дисплея (например, обратное видео ), а также настройка строк заголовков дисплея. Escape-коды, полученные от терминала, обозначают такие вещи, как функциональная клавиша , клавиша со стрелкой и другие специальные нажатия клавиш ( клавиша Home , клавиша завершения , клавиша справки , клавиша PgUp , клавиша PgDn , клавиша вставки , клавиша удаления и т. д.). [8] [9]
Эти возможности закодированы в базах данных, которые настраиваются системным администратором и доступны из программ через библиотеку terminfo (которая заменяет старую библиотеку termcap ), на основе которой, в свою очередь, создаются библиотеки, такие как библиотеки Curs и ncurses . Прикладные программы используют возможности терминала для предоставления текстовых пользовательских интерфейсов с окнами, диалоговыми окнами, кнопками, метками, полями ввода, меню и т. д. [10] [11]
Управление переменными среды: TERM
и др.
[ редактировать ] Конкретный набор возможностей терминала, который использует ввод и вывод программы (с поддержкой терминала), получается из базы данных, а не зашит в программы и библиотеки, и контролируется TERM
переменная среды (и, дополнительно для библиотек termcap и terminfo, переменная среды TERMCAP
и TERMINFO
переменные среды соответственно). [10] Эта переменная устанавливается любой программой монитора терминала, которая порождает программы, которые затем используют этот терминал для ввода и вывода, а иногда и явно. Например:
- Программа getty (или ее эквивалент) устанавливает
TERM
переменная среды в соответствии с системной базой данных (по-разному inittab или файлами конфигурации для программ ttymon или launchd ), определяющая, какие локальные терминалы подключены к каким последовательным портам и какие типы терминалов предоставляются локальными виртуальными терминалами или локальной системной консолью. - Пользователь коммутируемого доступа на удаленном терминале не использует тип терминала, который система обычно ожидает на этой коммутируемой линии, и поэтому вручную устанавливает
TERM
переменную среды сразу после входа в систему к правильному типу. (Как правило, тип терминала, установленный программой getty для коммутируемой линии, который системный администратор определил для наиболее частого использования пользователями коммутируемого доступа с удаленными терминалами, совпадает с тем, который используется пользователем коммутируемого доступа и этому пользователю не нужно переопределять тип терминала.) - Демон сервера SSH (или его эквивалент, например демон rlogin ) устанавливает
TERM
переменную среды к тому же типу терминала, что и SSH-клиент. [12] - Программный эмулятор терминала с помощью псевдотерминала устанавливает
TERM
переменная среды, чтобы указать тип терминала, который он эмулирует. Эмулируемые терминалы часто не совсем соответствуют реальному терминальному оборудованию, и эмуляторы терминалов имеют имена типов, предназначенные для их использования. Программа xterm (по умолчанию) устанавливаетxterm
например, тип терминала. [13] Программа GNU Screen устанавливаетscreen
как тип терминала.
Контроль заданий
[ редактировать ]Терминалы предоставляют средства контроля работы. В интерактивном режиме пользователь терминала может отправлять управляющие символы, которые приостанавливают текущее задание, возвращаясь к интерактивной оболочке управления заданиями, которая породила задание, и может запускать команды, которые переводят задания в «фоновый режим» или переключают другое фоновое задание. на передний план (при необходимости отключив его). [14] [15]
Линейные дисциплины
[ редактировать ]Строго говоря, в Unix-системах терминальное устройство содержит базовый драйвер устройства tty , отвечающий за физическое управление аппаратным обеспечением устройства с помощью инструкций ввода-вывода и обработку запросов прерывания устройства для ввода и вывода символов, а также дисциплину линии . отвечающего за несколько управляющих терминалов, может использоваться та же самая дисциплина линии, Дисциплина линии не зависит от аппаратного обеспечения фактического устройства, и для устройства -концентратора терминалов, что и для псевдотерминала. Фактически, линейная дисциплина (или, в случае BSD, AIX и других систем, линейная дисциплина ) одинакова для всех терминальных устройств. Именно строковая дисциплина отвечает за локальное эхо, редактирование строк, обработку режимов ввода, обработку режимов вывода и отображение символов. Все эти вещи не зависят от реального оборудования и действуют так же, как и простые абстракции, предоставляемые драйверами устройств tty: передача символа, прием символа, установка различных состояний оборудования. [16] [17]
В седьмой редакции Unix , системах BSD и их производных, включая macOS и Linux , каждое терминальное устройство можно переключать между несколькими линейными дисциплинами. [18] В системе AT&T STREAMS дисциплины линий представляют собой модули STREAMS, которые можно вставлять и извлекать из стека ввода-вывода STREAMS. [19]
История
[ редактировать ]Терминальный интерфейс POSIX создан на основе терминальных интерфейсов различных систем Unix.
Ранние Unix: Unix седьмого издания
[ редактировать ]Терминальный интерфейс, предоставляемый Unix 32V и Seventh Edition Unix, а также представленный BSD версии 4 как старый драйвер терминала , был простым и в основном ориентирован на телетайпы в качестве терминалов. Ввод вводился построчно, причем драйвер терминала в операционной системе (а не в самих терминалах) обеспечивал простые возможности редактирования строк. Ядро поддерживало буфер, в котором происходило редактирование. Приложения, читающие входные данные терминала, будут получать содержимое буфера только тогда, когда return На терминале была нажата клавиша для завершения редактирования строки. @ Ключ, отправленный с терминала в систему, сотрет («уничтожит») все текущее содержимое буфера редактирования и обычно отображается как ' Символ @ ', за которым следует последовательность новой строки, чтобы переместить позицию печати на новую пустую строку. # Ключ, отправленный с терминала в систему, удалит последний символ из конца буфера редактирования и обычно отображается как ' Символ # ', который пользователи должны будут распознать как обозначающий «затирание» предыдущего символа (телетайпы физически не способны стирать символы после того, как они были напечатаны на бумаге). [20] [21] [22] [23] [18]
С точки зрения программирования, терминальное устройство имело скорости передачи и приема , символы «стирания» и «уничтожения» (которые, как объяснялось, выполняли редактирование строки), символы «прерывания» и «выхода» (генерирующие сигналы для всех процессы, для которых терминал был управляющим терминалом), символы «старт» и «стоп» (используемые для управления потоком модема ), символ «конца файла» (действующий как возврат каретки, за исключением того, что он отбрасывается из буфера read()
системный вызов и, следовательно, потенциально вызывающий возврат результата нулевой длины) и различные флаги базового режима , определяющие, было ли локальное эхо эмулировано драйвером терминала ядра, было ли включено управление потоком модема, длины различных задержек вывода, отображение для каретки возвращаемый символ и три режима ввода. [24]
Три режима ввода были:
- линейный режим (также называемый «режим приготовления»)
В линейном режиме дисциплина линии выполняет все функции редактирования строки, распознает управляющие символы «прерывание» и «выход» и преобразует их в сигналы, отправляемые процессам. Прикладные программы, читающие с терминала, получают целые строки после завершения редактирования строки пользователем, нажав Enter. [21] [25]
- режим cbreak
Режим cbreak — это один из двух режимов посимвольной обработки. ( Стивен Р. Борн в шутку назвал его ( Bourne 1983 , стр. 288) «полуготовым» и, следовательно, «редким» режимом.) Дисциплина линии не выполняет редактирование строки, а управляющие последовательности для функций редактирования строки обрабатываются как обычный ввод символов. Прикладные программы, считывающие с терминала, получают символы немедленно, как только они становятся доступными во входной очереди для чтения. Однако управляющие символы «прерывание» и «выход», а также символы управления потоком данных модема по-прежнему обрабатываются особым образом и удаляются из входного потока. [26] [27]
- необработанный режим
- необработанный режим — это другой из двух посимвольных режимов. Дисциплина строки не выполняет редактирование строки, а последовательности управления как для функций редактирования строки, так и для различных специальных символов («прерывание», «выход» и управление потоком) обрабатываются как обычный ввод символов. Прикладные программы, считывающие с терминала, получают символы немедленно и принимают весь поток символов без изменений, так же, как он пришел от самого терминального устройства. [28] [26] [27]
Программный интерфейс для запроса и изменения всех этих режимов и управляющих символов был ioctl()
системный вызов . (Это заменило stty()
и gtty()
системные вызовы шестого издания Unix.) [29] [30] Хотя символы «стереть» и «уничтожить» можно было изменить по умолчанию. # и @В течение многих лет они были предустановленными значениями по умолчанию в драйверах терминальных устройств и во многих системах Unix, которые изменяли настройки терминального устройства только как часть процесса входа в систему, в сценариях входа в систему, которые запускались после того, как пользователь ввел имя пользователя и пароль. Любые ошибки при запросе логина и пароля приходилось исправлять, используя исторические ключевые символы редактирования, унаследованные от терминалов телетайпов. [23]
BSD: появление контроля над работой
[ редактировать ]В BSD Unix появилось управление заданиями и новый драйвер терминала с расширенными возможностями. [18] Эти расширения содержали дополнительные (опять же изменяемые программно) специальные символы:
- Символы «приостановить» и «отложенная приостановка» (по умолчанию Control+ Z и Control+ Y — ASCII
SUB
иEM
) вызвало появление новогоSIGTSTP
сигнал процессам в группе управляющих процессов терминала. [27] - Символы «стирание слова», «следующий буквальный» и «перепечатка» (по умолчанию Control+ W, Control+ V, и Control+ R — ASCII
ETB
,SYN
, иDC2
) выполнял дополнительные функции редактирования строк. «стирание слова» удаляет последнее слово в конце буфера редактирования строки. «литерал следующего» позволял вводить любой специальный символ в буфер редактирования строки (функция, доступная, несколько неудобно, в седьмом издании Unix через символ обратной косой черты). «перепечатка» заставляла дисциплину строки перепечатывать текущее содержимое буфера редактирования строки на новой строке (полезно, когда другой фоновый процесс генерировал выходные данные, которые смешивались с редактированием строки). [27]
Программный интерфейс для запроса и изменения всех этих дополнительных режимов и управляющих символов все еще оставался ioctl()
системный вызов, который его создатели ( Леффлер и др. 1989 , стр. 262) описали как «довольно загроможденный интерфейс». Все исходные функциональные возможности Unix седьмого издания были сохранены, а новые функциональные возможности были добавлены посредством дополнительных ioctl()
коды операций, в результате чего программный интерфейс явно увеличился и в некоторой степени дублировал функциональность. [31]
Система III и Система V
[ редактировать ]System III представила новый интерфейс программирования, который объединил отдельные возможности седьмого издания. ioctl()
операции для получения и установки флагов, а также для получения и установки управляющих символов в вызовах, которые использовали termio
структура, содержащая как флаги, так и управляющие символы, которая могла бы получить их за одну операцию и установить за одну другую операцию. Он также разделил некоторые флаги интерфейса седьмого издания на несколько отдельных флагов и добавил некоторые дополнительные возможности, хотя не поддерживал управление заданиями или улучшения режима приготовления 4BSD. [32] Например, он заменил «приготовленные», «cbreak» и «сырые» режимы седьмого издания различными абстракциями. Распознавание символов, генерирующих сигнал, не зависит от режима ввода, и существует только два режима ввода: канонический и неканонический. (Это позволяет использовать режим терминального ввода, отсутствующий в Seventh Edition и BSD: канонический режим с отключенной генерацией сигнала.)
Преемники System III, включая System V , использовали тот же интерфейс.
POSIX: Консолидация и абстракция
[ редактировать ]Одной из основных проблем, которую стандарт POSIX решил с помощью определения общего терминального интерфейса, было множество программных интерфейсов. Хотя ко времени появления стандарта поведение терминалов было довольно единообразным от системы к системе, большинство Unix-систем приняли понятия линейных дисциплин и возможности управления заданиями BSD, программный интерфейс к терминалам через ioctl()
системный вызов был беспорядком. Разные Unix-системы поставляются по-разному. ioctl()
операции с разными (символическими) именами и разными флагами. Переносимый исходный код должен был содержать значительный объем условной компиляции, чтобы учесть различия между программными платформами, хотя теоретически все они были Unix. [33]
Стандарт POSIX заменяет ioctl()
систему целиком, с набором библиотечных функций (которые, конечно, могут быть реализованы скрытно через платформенно-зависимые ioctl()
операций) со стандартизированными именами и параметрами. termio
структура данных System V Unix использовалась в качестве шаблона для POSIX. termios
структура данных, поля которой практически не изменились, за исключением того, что теперь для указания полей использовались псевдонимы типов данных, что позволяло разработчикам легко переносить их на несколько процессорных архитектур, вместо того, чтобы явно требовать unsigned short
и char
типы данных языков программирования C и C++ (размеры которых могут оказаться неудобными для некоторых процессорных архитектур). [33] [34]
POSIX также представил поддержку управления заданиями с помощью termios
структура, содержащая символы приостановки и отложенной приостановки в дополнение к управляющим символам, поддерживаемым System III и System V. Она не добавляла никаких расширений приготовленного режима из BSD, хотя SunOS 4.x, System V Release 4 , Solaris , HP -UX , AIX , новые BSD, macOS и Linux реализовали их как расширения для termios
.
Что определяет стандарт
[ редактировать ]Управление терминалами и группами процессов
[ редактировать ]Каждый процесс в системе имеет либо один управляющий терминал , либо вообще не имеет управляющего терминала. Процесс наследует свой управляющий терминал от своего родителя, и единственными операциями над процессом являются получение управляющего терминала процессом, у которого нет управляющего терминала, и его освобождение процессом, имеющим управляющий терминал. [33]
Портативный способ получения управляющего терминала не определен, метод определяется реализацией. Стандарт определяет O_NOCTTY
флаг для open()
системный вызов , который является способом предотвращения обычного способа получения управляющего терминала (процесс без управляющего терминала). open()
sa файл терминального устройства, который еще не является управляющим терминалом для какого-либо другого процесса, без указания O_NOCTTY
флаг [35] ), но оставляет его традиционную семантику необязательной.
Каждый процесс также является членом группы процессов. Каждое терминальное устройство записывает группу процессов, которая называется группой процессов приоритетного плана . Группы процессов управляют доступом к терминалу и доставкой сигналов. Сигналы, генерируемые на терминале, отправляются всем процессам, которые являются членами группы процессов переднего плана терминала. read()
и write()
Операции ввода-вывода на терминале, выполняемые процессом, который не является членом группы процессов переднего плана терминала, будут и могут опционально (соответственно) вызывать сигналы ( SIGTTIN
и SIGTTOU
соответственно) для отправки в вызывающий процесс. Различные библиотечные функции, изменяющие режим терминала, ведут себя так же, как и write()
, за исключением того, что они всегда генерируют сигналы, даже если эта функция отключена для write()
сам. [36] [37]
The termios
структура данных
[ редактировать ]
Структура данных, используемая всеми вызовами библиотеки терминалов, представляет собой termios
структура, [38] определение языка программирования C и C++ которого выглядит следующим образом: [34]
struct termios {
tcflag_t c_iflag ; // Input modes
tcflag_t c_oflag ; // Output modes
tcflag_t c_cflag ; // Control modes
tcflag_t c_lflag ; // Local modes
cc_t c_cc[NCCS] ; // Control characters
} ;
Порядок полей внутри termios
структура не определена, и реализациям разрешено добавлять нестандартные поля. [34] Действительно, реализации должны добавлять нестандартные поля для записи скоростей ввода и вывода. Они записываются в структуру в форме, определяемой реализацией, и доступ к ним осуществляется через функции доступа, а не путем прямого манипулирования значениями полей, как в случае с полями стандартизированной структуры. [39]
Псевдонимы типов данных tcflag_t
и cc_t
, а также символическая константа NCCS
и символические константы для различных флагов режима, имен управляющих символов и скорости передачи данных — все они определены в стандартном заголовке. termios.h
. (Это не следует путать с одноименным заголовком termio.h
из Системы III и Системы V, которая определяет аналогичный termio
структура и множество символических констант с одинаковыми названиями. Этот интерфейс специфичен для System III и System V, и код, использующий его, не обязательно будет переносим на другие системы.) [40]
Поля структуры (кратко, подробнее см. в основной статье) [ нужны разъяснения ] ):
c_iflag
- Флаги режима ввода для управления четностью ввода, трансляции новой строки ввода, управления потоком данных модема , 8-битной чистоты (последовательного порта) и реакции на состояние «обрыва» [34]
c_oflag
- Флаги режима вывода для управления постобработкой вывода, определяемой реализацией, переводом новой строки вывода и задержками вывода после отправки различных управляющих символов. [41] [27]
c_cflag
- флаги управления аппаратным обеспечением терминала для управления фактическим терминальным устройством, а не дисциплиной линии: количество битов в символе, тип четности, контроль зависания и контроль потока последовательной линии. [42]
c_lflag
- флаги локального управления для управления дисциплиной линии, а не терминальным оборудованием: канонический режим, режимы эха, распознавание и обработка символов генерации сигналов, а также включение генерации
SIGTTOU
сигнал с помощьюwrite()
системный вызов [39]
Функции библиотеки (кратко, подробнее см. в основной статье) [ нужны разъяснения ] ):
tcgetattr()
- запросить текущие настройки атрибутов терминального устройства в
termios
структура [43] tcsetattr()
- установить текущие настройки атрибутов терминального устройства из
termios
структура, опционально ожидающая очистки вывода в очереди и очистка ввода в очереди [43] cfgetispeed()
- запросить входную скорость передачи данных из полей, определенных реализацией, в
termios
структура [44] cfgetospeed()
- запросить выходную скорость передачи данных из полей, определенных реализацией, в
termios
структура [44] cfsetispeed()
- установите входную скорость передачи данных в полях, определенных реализацией, в файле
termios
структура [44] cfsetospeed()
- установите выходную скорость передачи данных в полях, определенных реализацией, в файле
termios
структура [44] tcsendbreak()
- отправить сигнал «обрыва» модема на терминал последовательного устройства [45]
tcdrain()
- дождитесь, пока выходные данные в очереди опустеют [45]
tcflush()
- отменить ввод в очереди [45]
tcflow()
- изменить управление потоком [45]
tcgetpgrp()
- запросить группу процессов переднего плана терминала [46]
tcsetpgrp()
- установить группу процессов переднего плана терминала [46]
Специальные символы
[ редактировать ]Поле | значение | Получено read() |
Примечания |
---|---|---|---|
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] |
"начинать" | Нет | Символ управления потоком модема, независимый от режима ввода |
The c_cc[]
член массива termios
Структура данных определяет все специальные символы (изменяемые программно). Индексы массива представляют собой символические константы, по одному для каждого типа специального символа, как показано в таблице справа. (Еще две записи в массиве относятся к обработке ввода в неканоническом режиме и обсуждаются ниже.) [43]
Непрограммно изменяемые специальные символы — это перевод строки (ASCII LF
) и возврат каретки (ASCII CR
). [47]
Обработка ввода
[ редактировать ]Обработка ввода определяет поведение read()
системный вызов на терминальном устройстве, а также характеристики редактирования линии и генерации сигналов для дисциплины линии. В отличие от Unix Seventh Edition и BSD версии 4, а также от System III и System V, редактирование строк работает в одном из двух режимов: каноническом и неканоническом. Основное различие между ними заключается в том, когда с точки зрения требований к блокировке/неблокировке read()
системный вызов (указанный с помощью O_NONBLOCK
флаг в файловом дескрипторе через open()
или fcntl()
), данные «доступны для чтения». [48]
Канонический режим обработки
[ редактировать ]В каноническом режиме данные накапливаются в буфере редактирования строк и не становятся «доступными для чтения» до тех пор, пока редактирование строки не будет прекращено пользователем (на терминале), отправившим символ-разделитель строк . Символы-разделители строк — это специальные символы, а именно конец файла , конец строки и перевод строки (ASCII LF
). Первые два настраиваются программно, а второй фиксированный. Последние два включены в буфер редактирования строки, а первый — нет. [49]
Точнее, в буфере редактирования строк накапливается ноль или более строк, разделенных разделителями строк (которые могут быть отброшены, а могут и не быть отброшены один раз). read()
приходит к их чтению), а редактирование строк работает с той частью буфера редактирования строк, которая следует за последним (если есть) разделителем строк в буфере. Так, например, символ «стирания» (каким бы он ни был запрограммирован) сотрет последний символ в буфере строк только до (но не включая) предыдущего разделителя строки. [49]
Неканонический режим обработки
[ редактировать ]В неканоническом режиме данные накапливаются в буфере (который может быть или не быть буфером редактирования строки — некоторые реализации имеют отдельные очереди «обработанного ввода» и «необработанного ввода») и становятся «доступными для чтения» в соответствии со значениями двух входных параметров управления, c_cc[MIN]
и c_cc[TIME]
члены termios
структура данных. Обе величины являются беззнаковыми (поскольку cc_t
должен быть псевдонимом для беззнакового типа). Первый указывает минимальное количество символов, а второй — тайм-аут в десятых долях секунды. [50] Есть четыре возможности:
c_cc[TIME]
иc_cc[MIN]
оба равны нулю- В этом случае данные в буфере «доступны для чтения» сразу, и
read()
немедленно возвращает все данные, находящиеся в буфере (потенциально возвращает ноль, если доступны нулевые данные). [51] c_cc[TIME]
не равно нулю иc_cc[MIN]
равен нулю- В этом случае данные в буфере «доступны для чтения» по истечении заданного таймаута, при этом таймер срабатывает по началу буфера.
read()
системный вызов или если получен один символ. Другими словами,read()
ожидает максимальное заданное общее время и может возвращать нулевые данные и возвращает любые данные, как только они будут получены. [51] c_cc[TIME]
равен нулю иc_cc[MIN]
ненулевое значение- В этом случае данные в буфере «доступны для чтения» после того, как в буфер поступило заданное количество символов. Другими словами,
read()
ожидает минимального объема данных (который может быть больше, чем тот, который вызывающая сторона готова прочитать в системном вызове), не возвращает нулевые данные и может ждать бесконечно. [51] c_cc[TIME]
иc_cc[MIN]
оба ненулевые- В этом случае данные в буфере «доступны для чтения» после поступления в буфер заданного количества символов или истечения таймаута с момента ввода последнего символа. Для самого первого символа таймаута нет. Другими словами,
read()
ожидает минимального объема данных (который может быть больше, чем тот, который вызывающая сторона готова прочитать в системном вызове), не возвращает нулевые данные, может ждать бесконечно, но не будет ждать дольше указанного таймаута, если хотя бы один символ находится в буфере для чтения. [51]
Обработка вывода
[ редактировать ]Обработка вывода практически не изменилась по сравнению с ее корнями в Системе III/Системе V. Флаги управления режимом вывода определяют различные опции:
- Возврат каретки может быть вставлен перед каждым символом перевода строки, чтобы преобразовать семантику новой строки Unix в семантику ASCII, которую ожидают многие терминалы. [27] [22]
- Терминалам может быть предоставлено время для выполнения различных управляющих кодов, которые (на телетайпе или аналогичном устройстве) приведут к физическим перемещениям каретки, которые могут занять значительное (с точки зрения компьютера) количество времени, например, пробелы, горизонтальные табуляции, каретка возвраты, переводы форм и переводы строк. [27] [52]
Примечания
[ редактировать ]- ^ Jump up to: а б с Кристиан 1988 , с. 11.
- ^ Борн 1983 , с. 6.
- ^ Гроб 1991 , с. 820.
- ^ Гроб 1991 , с. 23–24.
- ^ Леффлер и др. 1989 , с. 259.
- ^ Jump up to: а б Гроб 1991 , с. 24.
- ^ Леффлер и др. 1989 , с. 37–38.
- ^ Афзал 2008 , с. 419.
- ^ Фриш 2002 , с. 770.
- ^ Jump up to: а б Гроб 1991 , с. 115.
- ^ Гроб 1991 , с. 372.
- ^ Гроб 1991 , с. 779.
- ^ Гроб 1991 , с. 751–752.
- ^ Леффлер и др. 1989 , с. 265.
- ^ Леффлер и др. 1989 , с. 103.
- ^ Леффлер и др. 1989 , с. 38.
- ^ Леффлер и др. 1989 , с. 260–261.
- ^ Jump up to: а б с Леффлер и др. 1989 , с. 262.
- ^ Кристиан 1988 , с. 395.
- ^ Борн 1983 , с. 8.
- ^ Jump up to: а б Борн 1983 , с. 130–131.
- ^ Jump up to: а б Борн 1983 , с. 287.
- ^ Jump up to: а б Кристиан 1988 , с. 26.
- ^ Борн 1983 , с. 132–133.
- ^ Леффлер и др. 1989 , с. 259–260.
- ^ Jump up to: а б Борн 1983 , с. 288.
- ^ Jump up to: а б с д и ж г Леффлер и др. 1989 , с. 260.
- ^ Борн 1983 , с. 132.
- ^ Борн 1983 , с. 133.
- ^ Кристиан 1988 , с. 393.
- ^ Леффлер и др. 1989 , с. 262–263.
- ^ «Исходный код справочной страницы System III tty(4)» . Проверено 5 октября 2012 г.
- ^ Jump up to: а б с Злотник 1991 , с. 157.
- ^ Jump up to: а б с д Злотник 1991 , с. 163.
- ^ Борн 1983 , с. 130.
- ^ Злотник 1991 , с. 158.
- ^ Злотник 1991 , с. 173–174.
- ^ Злотник 1991 , с. 162.
- ^ Jump up to: а б Злотник 1991 , с. 166.
- ^ Злотник 1991 , с. 162–163.
- ^ Злотник 1991 , с. 164.
- ^ Злотник 1991 , с. 165.
- ^ Jump up to: а б с Злотник 1991 , с. 167.
- ^ Jump up to: а б с д и Злотник 1991 , с. 169.
- ^ Jump up to: а б с д Злотник 1991 , с. 172.
- ^ Jump up to: а б Злотник 1991 , с. 174.
- ^ Jump up to: а б Злотник 1991 , с. 159.
- ^ Злотник 1991 , с. 160.
- ^ Jump up to: а б Злотник 1991 , с. 160–161.
- ^ Злотник 1991 , с. 161.
- ^ Jump up to: а б с д Злотник 1991 , с. 161–162.
- ^ Борн 1983 , с. 287–288.
Источники
[ редактировать ]- Афзал, Амир (2008). UNIX без границ: начальный подход (5-е изд.). Прентис Холл. ISBN 978-0-13-119449-6 .
- Борн, Стивен Р. (1983). Система UNIX . Международная серия по информатике. Аддисон-Уэсли. ISBN 978-0-201-13791-0 .
- Кристиан, Кааре (1988). Операционная система UNIX (2-е изд.). Джон Уайли и сыновья. ISBN 978-0-471-84781-6 .
- Гроб, Стивен (1991). UNIX system V, выпуск 4: полный справочник . Осборн МакГроу-Хилл. ISBN 978-0-07-881653-6 .
- Фриш, Элин (2002). Основное системное администрирование . Краткое руководство (3-е изд.). O'Reilly Media, Inc. ISBN 978-0-596-00343-2 .
- Леффлер, Сэмюэл Дж.; МакКьюсик, Маршалл Кирк ; Карелс, Майкл Дж.; Квартерман, Джон С. (1989). «Терминальное обслуживание». Проектирование и внедрение операционной системы 4.3BSD UNIX . Серия Аддисона-Уэсли по информатике. Аддисон-Уэсли. ISBN 978-0-201-06196-3 .
- Злотник, Фред (1991). «Управление терминальными устройствами». Стандарт POSIX.1: руководство программиста . Паб Бенджамин / Каммингс. компании ISBN 978-0-8053-9605-8 .
Дальнейшее чтение
[ редактировать ]- «11. Общий интерфейс терминала» . Базовые характеристики открытой группы . 6. Открытая группа . 2004.
- Левин, Дональд А. (1991). «Терминал ввода-вывода». Руководство программиста POSIX: написание переносимых программ UNIX со стандартом POSIX.1 . Серия информатики. O'Reilly Media, Inc. ISBN 978-0-937175-73-6 .