Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

Программисты для DOS, впервые сталкиваясь с программированием для Linux, обнаруживают пугающий их факт. Оказывается, вывод символов на экран — это не просто инициализация указателя на адрес экрана в памяти и последующая запись прямо через него. Некоторые даже жалуются в полный голос на эту "отсталую" систему, которая вынуждает их делать вид, что они выводят информацию в последовательный терминал, вписывая между символами управляющие последовательности. Последние выводятся на экран для управления перемещением курсора, цветом, очисткой экрана и так далее.

Существует несколько веских причин для того, чтобы рассматривать консоль как фиктивный последовательный терминал. И не последняя из них заключается в том, что когда программа уже активизирована на последовательном терминале, она все еще работает. Еще более важным является то, что программа корректно работает в сетях (в наше время Internet), а также в окне терминального эмулятора под X или каким-либо другим графическим интерфейсом пользователя. Более того, удаленно работающие программы (либо через сеть, либо через последовательное соединение) соответствующим образом выводят информацию на вашу консоль.

Кроме того, вы заметите, что управляющие коды являются рациональными низкоуровневыми интерфейсами для экрана. Они также служат хорошей основой для построения примитивов более высокого уровня вроде модуля curses, описанного в [36]. И это не просто случайность; последовательные терминалы являются весьма уважаемой технологией, которая годами превосходно отвечает фактическим потребностям программистов. Консоль Linux основана на наиболее популярном семействе последовательных терминалов, наследников DEC VT100.

Большинство управляющих последовательностей используют символ перехода (escape) ANSI, который не имеет печатного представления. Мы будем следовать библиотекам

termcap
и
terminfo,
в которых для обозначения символа перехода ANSI применяется
^[
. Имейте в виду при чтении, что они иногда ссылаются на тот же самый символ, как на
\Е
. Всюду в данной книге, как и в
termcap
и
terminfo
, выражение
^C
указывает на символ Control-C.

21.1. Базы данных возможностей

Действия, контролируемые заданными управляющими последовательностями, часто называются возможностями (capabilities). Некоторые управляющие последовательности совместно используются большим числом терминалов. Многие из таких последовательностей определены в стандарте ANSI X3.64-1979. Почти все терминалы с возможностями поддержки цвета используют одни и те же последовательности для выбора цветов изображения. При этом многие терминалы поддерживают совершенно различные управляющие последовательности. Например, на терминале Wyse 30 нажатие <F1> передает последовательность

^A@\r
, тогда как на консоли Linux — последовательность
^[[[А
. Аналогично, для того, чтобы переместить курсор вверх на Wyse 30, нужно послать символ
^K
, а на консоли Linux — последовательность
^[[А
. Для создания программы, которая может работать на любом терминале, вам крайне необходим метод абстрагирования подобных различий, который позволит программировать возможности, а не необработанные последовательности символов.

Наиболее известная библиотека программирования, которая предоставляет такую абстракцию, называется

curses
[154] (предписания); она описана в [36]. В нее входит два важных концептуальных уровня. Первый уровень предлагает функции, которые (говоря в общем) посылают одну управляющую последовательность для выполнения одного действия, такого как перемещение курсора вверх или вниз, прокрутка экрана и так далее. Второй уровень реализует концепцию "окон": независимые области окна, которые могут обрабатываться отдельно, при этом
curses
обеспечивает кратчайшие последовательности символов для достижения требуемого эффекта.

154

Библиотека

curses
определена в X/Open. Реализация, которая входит в состав Linux, представляет собой совместимую в данный момент с X/Open XSI Curses версию базового уровня.

Библиотека

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

Linux, как все современные системы Unix, предлагает две базы данных, которые описывают терминалы в смысле их возможностей и соответствующих им управляющих последовательностей. Более старая база данных называется

termcap
(сокращение от terminal capabilities — терминальные возможности) и хранится в одном большом двумерном ASCII-файле по имени
/etc/termcap
. Этот файл постепенно стал очень громоздким; его размер вырос приблизительно до половины мегабайта. Более новая база данных называется
terminfo
(сокращение от terminal information — терминальная информация) и хранится во множестве бинарных файлов (по одному на терминал), как правило, в подкаталогах каталога
/usr/lib/terminfo
.

Внутри каждой базы данных информация о возможностях для каждого терминала индексируется одним (или более) уникальным именем. Обе базы данных используют одно и то же имя для одного и того же сериала. Например, консоль Linux называется

linux
и в
termcap
, и в
terminfo
. Вы сообщаете программам, какой терминальный вход использовать, путем установки переменной окружения
TERM
. При создании программ, использующих
termcap
и
terminfo
, вам редко придется обращаться к переменной
TERM
; обычно это берут на себя низкоуровневые библиотеки для получения доступа к базам данных
termcap
или
terminfo
.

  • Читать дальше
  • 1
  • ...
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: