Опубликован: 15.06.2004 | Доступ: свободный | Студентов: 2557 / 712 | Оценка: 4.35 / 3.96 | Длительность: 27:47:00
ISBN: 978-5-9556-0011-6
Лекция 9:

Общий терминальный интерфейс

< Лекция 8 || Лекция 9: 12345 || Лекция 10 >

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

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

tty

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

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

tty > /tmp/tty.res
tty < /tmp/tty.res > /tmp/tty.res
Листинг 9.1. Пример использования служебной программы tty.
/dev/ttyS4
not a tty
Листинг 9.2. Возможный результат использования служебной программы tty.

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

#include <unistd.h>
int isatty (int fildes);
char *ttyname (int fildes);
Листинг 9.3. Описание функций isatty() и ttyname().

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

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

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

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

-a

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

-g

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

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

stty -a

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

speed 19200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; start = ^Q; stop = ^S; susp = <undef>; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon ixoff
-iuclc -ixany -imaxbel
opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0
ff0
isig icanon -iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
-echoctl echoke
Листинг 9.4. Возможный результат команды stty -a.

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

stty kill '^k'

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

stty -echo

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

stty echo

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

saved="$(stty -g)"
stty  новые_характеристики
 . . .
stty $saved
Листинг 9.5. Пример сохранения и восстановления характеристик терминала.
< Лекция 8 || Лекция 9: 12345 || Лекция 10 >
Антон Коновалов
Антон Коновалов

В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13
Планируется ли актуализация материалов данного очень полезного курса?