Подсистема tty

AIX - это многопользовательская операционная система, причем с ней могут работать пользователи как локальных, так и удаленных компьютеров. На уровне соединений эта возможность обеспечивается подсистемой tty.

Связью между терминалами и программами, работающими с ними, управляет интерфейс терминала. Примеры устройств tty приведены ниже:

  • Модемы
  • текстовые терминалы
  • Системные консоли
  • Последовательные принтеры
  • Xterm или aixterm в X-Windows

В этом разделе рассматриваются следующие вопросы:

Задачи подсистемы TTY

Подсистема tty отвечает за:

  • Управление передачей данных по асинхронной линии связи (скоростью передачи, размером символов и доступом к линии)
  • Интерпретацию данных, включая распознавание специальных символов и определение языка
  • Управление заданиями и доступом к терминалам с помощью модели управляющего терминала

Управляющий терминал обслуживает операции ввода-вывода группы процессов. Особый файл tty обеспечивает интерфейс для управляющего терминала. В реальной работе пользовательские программы редко явно открывают файлы терминалов, такие как dev/tty5. Эти файлы открываются командой getty или rlogind. После этого они применяются в качестве устройств стандартного ввода и вывода.

Модули подсистемы tty

Для выполнения поставленных задач подсистема tty разбита на модули. Модуль отвечает за один из уровней передачи данных между компьютером и асинхронным устройством. Модули tty могут добавляться и удаляться динамически.

Подсистема tty поддерживает три основных типа модулей:

Драйверы tty

Драйверы tty, или аппаратные дисциплины, напрямую управляют аппаратным (для устройств tty) или псевдоаппаратным (для устройств pty) обеспечением. Драйверы занимаются обменом данными с адаптером, обеспечивая для вышестоящих модулей работу таких служб, как управление потоком и специальная семантика открытия порта.

Существуют следующие драйверы tty:

Драйвер Описание
cxma 128-портовый асинхронный контроллер PCI.
cxpa 8-портовый асинхронный контроллер PCI.
lft Низкоуровневый терминал. Имя этого терминала - /dev/lftY, где Y >= 0.
sa 2-портовый асинхронный адаптер PCI EIA-232.
sf Универсальные асинхронные приемники/приемопередатчики (UART) на планаре системы.

Дополнительная информация приведена в разделе Драйверы TTY.

Дисциплины линии

Дисциплины линии предназначены для управления заданиями и интерпретации специальных символов. Они выполняют все необходимые преобразования входящих и исходящих потоков данных. Кроме того, дисциплины линии обрабатывают ошибки и отслеживают состояние драйвера tty.

Предусмотрены следующие дисциплины линии:

Функция Описание
ldterm Терминал
sptr Принтер (команда splp)
slip Линия связи SLIP (команда slattach)

Модули преобразования

Модули, или дисциплины, преобразования предназначены для обработки символов ввода и вывода.

Предусмотрены следующие модули преобразования:

Агент преобразования Описание
nls Поддержка национальных языков; этот модуль преобразует символы входящих и исходящих потоков в соответствии с таблицами, определенными для порта (см. описание команды setmaps)
lc_sjis и uc_sjis Первичные и вторичные модули преобразования многобайтовых символов из SJIS (Shifted Japanese Industrial Standard) в AJEC (Advanced Japanese EUC Code) для дисциплины линии ldterm.

Дополнительная информация о модулях преобразования приведена в разделе Модули преобразования.

Структура подсистемы TTY

Подсистема tty основана на потоках. Это позволяет создать гибкую структуру, разбитую на модули, которая обладает следующими свойствами:

  • Простота настройки: пользователи могут настраивать подсистему tty, добавляя и удаляя отдельные модули.
  • Многократное использование модулей: например, один модуль дисциплины линии может применяться для различных устройств tty с разными конфигурациями.
  • Простота добавления новых функций в подсистему терминалов.
  • Возможность работы с различными устройствами через один интерфейс.

Поток tty состоит из следующих модулей:

  • Начало потока, в котором обрабатываются пользовательские запросы. У всех потоков терминалов, независимо от дисциплины линии и драйвера, общее начало.
  • Необязательный первичный модуль преобразования (например, uc_sjis), обрабатывающий входящие и исходящие данные перед дисциплиной линии.
  • Дисциплина линии.
  • Необязательный вторичный модуль преобразования (например, lc_sjis), обрабатывающий входящие и исходящие данные после дисциплины преобразования.
  • Необязательный модуль преобразования символов (nls), обрабатывающий входящие и исходящие данные перед драйвером терминала.
  • Конец потока: драйвер терминала.

Модули, связанные с поддержкой национальных языков, подключаются только при необходимости.

Для принтера модули поддержки национальных языков обычно отсутствуют, что существенно упрощает структуру потока.

Стандартные функции

Интерфейсы стандартных функций подсистемы tty описаны в файлах /usr/include/sys/ioctl.h и /usr/include/termios.h. Файл ioctl.h, применяемый всеми модулями, содержит структуру winsize и несколько команд ioctl. Файл termios.h содержит типы данных и функции, определенные в стандарте POSIX.

Эти функции объединены в группы по своему назначению и описаны ниже.

Функции управления аппаратным обеспечением

Для управления аппаратным обеспечением предназначены следующие функции:

Функция Описание
cfgetispeed Возвращает скорость получения данных в бодах
cfgetospeed Возвращает скорость передачи данных в бодах
cfsetispeed Задает скорость получения данных в бодах
cfsetospeed Задает скорость передачи данных в бодах
tcsendbreak Передает сигнал прерывания по асинхронной последовательной линии

Функции управления потоком

Для управления потоком предназначены следующие функции:

Функция Описание
tcdrain Ожидает завершения вывода
tcflow Выполняет функции управления потоком
tcflush Очищает указанную очередь

Функции для работы с терминалом

Для получения информации и управления терминалом предназначены следующие функции:

Функция Описание
isatty Определяет, является ли устройство терминалом
setcsmap Считывает файл преобразования кодовых наборов и связывает его с устройством стандартного ввода
tcgetattr Возвращает состояние терминала
tcsetattr Задает состояние терминала
ttylock, ttywait, ttyunlock или ttylocked Управляют функциями блокировки терминала
имя-терминала Возвращает имя терминала

Функции изменения размера окна и терминала

Ядро сохраняет структуру winsize с информацией о размере текущего терминала или окна. Структура winsize содержит следующие поля:

Поле Описание
ws_row Число строк (символов) окна или терминала
ws_col Число столбцов (символов) окна или терминала
ws_xpixel Горизонтальный размер окна или терминала в пикселах
ws_ypixel Вертикальный размер окна или терминала в пикселах

По принятому соглашению, значение 0 во всех полях структуры winsize означает, что она еще не была заполнена.

Функция Описание
termdef Запрашивает характеристики терминала.
TIOCGWINSZ Возвращает размер окна. В качестве аргумента этой операции передается указатель на структуру winsize, в которую помещаются параметры текущего окна или терминала.
TIOCSWINSZ Задает размер окна. В качестве аргумента этой операции передается указатель на структуру winsize, в которую помещаются новые параметры окна или терминала. Если переданная информация отличается от текущей, группе процессов терминала отправляется сигнал SIGWINCH.

Функции управления группами процессов

Для управления группой процессов предназначены следующие функции:

Функция Описание
tcgetpgrp Возвращает идентификатор интерактивной группы процессов
tcsetpgrp Задает идентификатор интерактивной группы процессов

Операции изменения размера буфера

Следующие операции ioctl задают размер буферов ввода и вывода на терминал. В качестве аргумента этим операциям передается указатель на размер буфера.

Операции Описание
TXSETIHOG Задает максимальное число символов, которые могут быть получены и сохранены во внутренних буферах подсистемы tty до получения процессом. Значение по умолчанию равно 8192. При чтении символа с номером, на единицу превышающим заданное значение, в протокол заносится сообщение об ошибке, а буфер очищается. Размер буфера не должен быть слишком большим, поскольку буфер расположен в закрепленной памяти системы.
TXSETOHOG Задает максимальное число символов, которые могут быть помещены в буфер для вывода. Значение по умолчанию равно 8192. После заполнения буфера символы перестают выводиться. Размер буфера не должен быть слишком большим, поскольку буфер расположен в закрепленной памяти системы.

Синхронизация

Синхронизация подсистемы tty обеспечивается модулем STREAMS. Модули потоков tty поддерживают синхронизацию на уровне пар очередей. Такая синхронизация позволяет разделить обработку на два параллельных потока.