В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13 |
Общий терминальный интерфейс
Служебные программы и функции для управления терминалами
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. Пример сохранения и восстановления характеристик терминала.