AIX - это многопользовательская операционная система, причем с ней могут работать пользователи как локальных, так и удаленных компьютеров. На уровне соединений эта возможность обеспечивается подсистемой tty.
Взаимодействие между терминалами и программами происходит через интерфейс tty. Примеры устройств tty приведены ниже:
В этом разделе рассматриваются следующие вопросы:
Управляющий терминал обслуживает операции ввода-вывода группы процессов. Особый файл tty обеспечивает интерфейс для управляющего терминала. В реальной работе пользовательские программы редко явно открывают файлы терминалов, такие как dev/tty5. Эти файлы открываются командой getty или rlogind. После этого они применяются в качестве устройств стандартного ввода и вывода.
Для выполнения поставленных задач подсистема tty разбита на модули. Модуль отвечает за один из уровней передачи данных между компьютером и асинхронным устройством. Модули tty могут добавляться и удаляться динамически.
Подсистема tty поддерживает три основных типа модулей:
Драйверы tty, или аппаратные дисциплины, напрямую управляют аппаратным (для устройств tty) или псевдоаппаратным (для устройств pty) обеспечением. Драйверы занимаются обменом данными с адаптером, обеспечивая для вышестоящих модулей управление потоком и специальную семантику открытия порта.
Существуют следующие драйверы
tty:
Дополнительная информация по этому вопросу приведена в разделе Драйверы tty.
Дисциплины линии предназначены для управления заданиями и интерпретации специальных символов. Они выполняют все необходимые преобразования входящих и исходящих потоков данных. Кроме того, дисциплины линии обрабатывают ошибки и отслеживают состояние драйвера tty.
Предусмотрены следующие дисциплины
линии:
ldterm | Устройства терминалов (см. Модуль дисциплины линии (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 описаны в файлах /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 | Управляют функциями блокировки терминала |
ttyname | Возвращает имя терминала |
Ядро сохраняет структуру
winsize с информацией о размере текущего терминала или окна.
Структура winsize содержит следующие поля:
По принятому соглашению, значение
0 во всех полях структуры winsize означает, что она еще не была
заполнена.
termdef | Запрашивает характеристики терминала. |
TIOCGWINSZ | Возвращает размер окна. В качестве аргумента этой операции передается указатель на структуру winsize, в которую помещаются параметры текущего окна или терминала. |
TIOCSWINSZ | Задает размер окна. В качестве аргумента этой операции передается указатель на структуру winsize, в которую помещаются новые параметры окна или терминала. Если переданная информация отличается от текущей, группе процессов терминала отправляется сигнал SIGWINCH. |
Для управления группой процессов
предназначены следующие функции:
tcgetpgrp | Возвращает идентификатор интерактивной группы процессов |
tcsetpgrp | Задает идентификатор интерактивной группы процессов |
Следующие операции ioctl задают
размер буферов ввода и вывода на терминал. В качестве аргумента этим
операциям передается указатель на размер буфера.
Синхронизация подсистемы tty обеспечивается модулем STREAMS. Модули потоков tty поддерживают синхронизацию на уровне пар очередей. Такая синхронизация позволяет разделить обработку на два параллельных потока.
Глава 7, Управление вводом и выводом
Глава 16, Поддержка национальных языков
Модуль дисциплины линии (ldterm)
Особый файл lft описывает драйвер консоли.
Файл termios.h содержит структуры данных, применяемые с дисциплинами линий POSIX.
Файл termiox.h содержит интерфейс управления аппаратным потоком данных для асинхронных линий.
Особый файл tty - это синоним для управляющего терминала.
Особый файл pty описывает драйвер устройства псевдотерминала.