Подсистема 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 поддерживают синхронизацию на уровне пар очередей. Такая синхронизация позволяет разделить обработку на два параллельных потока.