Программирование в стандарте POSIX

       

Служебные программы и функции для управления терминалами


Служебная программа

tty

позволяет узнать имя пользовательского терминала. Более точно, она выдает на стандартный вывод имя терминала, открытого в качестве стандартного ввода.

Если для примера перенаправить стандартный ввод (см. пример 9.1), можно получить результат, показанный в пример 9.2.

tty > /tmp/tty.res tty < /tmp/tty.res > /tmp/tty.res

Листинг 9.1. Пример использования служебной программы tty. (html, txt)

/dev/ttyS4 not a tty

Листинг 9.2. Возможный результат использования служебной программы tty. (html, txt)

Узнать, ассоциирован ли открытый файловый дескриптор с терминальным устройством, а также получить имя этого устройства можно с помощью функций isatty() и ttyname() (см. пример 9.3).

#include <unistd.h> int isatty (int fildes); char *ttyname (int fildes);

Листинг 9.3. Описание функций isatty() и ttyname(). (html, txt)

Если с дескриптором ассоциирован терминал, функция isatty() возвращает единицу, а ttyname() - указатель на цепочку символов (располагающуюся, быть может, в перезаписываемой каждым вызовом статической области). В противном случае возвращаются, соответственно, нуль и пустой указатель.

Каждый терминал обладает рядом характеристик, которые можно опросить и/или изменить. Для этого служит утилита stty:

stty [ -a | -g] stty характеристика ...



Будучи вызванной без опций и операндов, она выдает значения основных характеристик терминала, ассоциированного со стандартным вводом. Смысл опций таков:

-a

Выдать значение всех установленных характеристик.

-g

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

В частности, выдача команды

stty -a

может выглядеть так, как показано в пример 9.4. Здесь присутствуют как стандартные, так и специфичные для ОС Linux характеристики (минус перед именем характеристики означает, разумеется, что соответствующий флаг не установлен). Например, для опрашиваемого терминала задан канонический режим ввода и постпроцессирование вывода, но отсутствует контроль четности.
Можно видеть также, какие символы назначены на роли специальных управляющих.

Листинг 9.4. Возможный результат команды stty -a. (html, txt)

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

stty kill '^k'

для отмены строки придется нажимать CTRL+K. Вслед за выполнением команды

stty -echo

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

stty echo

Сохранение и восстановление характеристик терминала можно реализовать так, как показано в пример 9.5.

saved="$(stty -g)" stty новые_характеристики . . . stty $saved

Листинг 9.5. Пример сохранения и восстановления характеристик терминала. (html, txt)


Содержание раздела