Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Гл.8 ОС буклет.doc
Скачиваний:
5
Добавлен:
11.11.2018
Размер:
286.21 Кб
Скачать

8.1.2. Терминальное ввод-вывод в unix и Linux

Рассмотрим особенности реализации и использования терминального ввода-вывода в UNIX-системах на примере Linux.

Файлы терминальных устройств и консоль

Каждому терминалу в Linux (как и в других UNIX-системах) отвечает файл символьного устройства.

Например: -файлы /del/ttyn (n = 1, 2..., 63) отвечают терминалам виртуальной консоли (доступный набор таких терминалов, который дает возможность открывать несколько параллельных сессий пользователя; для переключения между виртуальными консолями используют комбинации клавиш Ctrl+Fn),

-файлы /dev/ttySn -терминалам, связанным с соединениями через последовательный порт.

Открыв такой файл, можно работать с соответствующим терминалом.

tty2 = open(“/dev/tty2”.0_RDWR. 0644);

write(tty2. "Вывод на 2 виртуальную консоль\ n". ...);

Консоль Linux эмулирует специальный вид терминала, который называют Linux. Он предоставляет достаточно широкие возможности относительно управления отображением информации (поддержку цвета, управляющих клавиш, переопределения символьной таблицы «на ходу»).

Текущую консоль отображают файлом /dev/console.

Псевдотерминалы

Раньше уже речь шла о принципе работы протокола telnet. Возникает вопрос: каким образом telnet-сервер перехватывает данные, которые процессы отсылают на терминал? Для ответа нужно ознакомиться с концепцией псевдотерминалов.

Псевдотерминалом (pty) называют специальное устройство, которое создает и контролирует процесс режима пользователя (ведущий процесс, pty master).

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

Псевдотерминал отображают двумя специальными файлами устройств:

-файлом ведущего (pty master file)

-файлом ведомого (pty slave file).

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

Есть несколько интересных применений псевдотерминалов.

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

Управляющий терминал процесса

Процесс в UNIX-системе может иметь управляющий терминал, c которого процесс будет получать сигналы от клавиатуры (SIGINT в случае нажатия пользователем Ctrl+C и SIGQUIT – Ctrl+D). Обычно это терминал, с которого вошел в систему пользователь, создавший процесс. Для процесса доступный файл /dev/tty, который соответствует этому терминалу.

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

Заранее определены файловые дескрипторы

Открывать каждый раз файл управляющего терминала во время ввода-вывода не очень удобно. Рассмотрим средства, которые предоставляют ОС для упрощения работы с таким терминалом.

Во время создания нового процесса в его таблице файловых дескрипторов fd предварительно создают три элемента, которые используют в качестве заранее определены файловые дескрипторы. Они отвечают трем предварительно открытым файлам, доступным для каждого процесса и по умолчанию связанны с управляющим терминалом пользователя, который создал этот процесс:

  • stdin - файл стандартного ввода (ему отвечает дескриптор fd[0]);

  • stdout - файл стандартного вывода (ему отвечает -fd[1]);

  • stderr - файл сообщений об ошибках (ему отвечает -fd[2]).

Вызов write(1. ...) или write(2. ...) означает вывод на соответствующий терминал, read(0. ...) - ввод с клавиатуры, связанной с этим терминалом. Такую концепцию сегодня используют и у других ОС, которые поддерживают терминальный ввод-вывод.

Есть много прикладных и системных программ, которые рассчитаны на получение данных из файла стандартного вводa и отображения результатов в файл стандартного вывода. Такие программы называют фильтрами. Среди самых известных фильтров можно выделить:

-sort (сортировка файла стандартного вводa, записывания результата на стандартный вывод),

-grep (поиск заданного раздела в стандартном вводе, записывание строк, где найден этот раздел, на стандартный вывод).