Jump to content

Терминальный интерфейс POSIX

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

Общие основные понятия

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

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

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

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

Интеллект и возможности терминала

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

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

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

В отличие от своего мэйнфрейма и миникомпьютера [ нужна ссылка ] По мнению современников, первоначальная система 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]

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

[ редактировать ]
Программно изменяемые специальные символы [47] [44]
Поле значение Получено 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]

Примечания

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

Источники

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

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

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 192988f77055561cd2e464baaf0e2f14__1703025180
URL1:https://arc.ask3.ru/arc/aa/19/14/192988f77055561cd2e464baaf0e2f14.html
Заголовок, (Title) документа по адресу, URL1:
POSIX terminal interface - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)