Управление терминалами с помощью библиотеки S-Lang
С помощью библиотеки S-Lang, написанной Джоном Дэвисом (John Е. Davis), можно осуществлять доступ к терминалам на среднем уровне. Все действия, связанные с управлением терминалами на низком уровне, осуществляются посредством набора подпрограмм, предлагающих прямой доступ к видеотерминалам и автоматически управляющих прокруткой и цветами. Несмотря на незначительную прямую поддержку окон и отсутствие в S-Lang каких-либо элементов управления, для таких задач эта библиотека предлагает удобную основу [167] .
167
Один из авторов этой книги разработал набор инструментальных средств
newt
для управления окнами на высоком уровне на основе S-Lang; этот набор входит в состав большинства распространяемых дистрибутивов Linux.
Библиотеку S-Lang можно использовать и для работы в DOS, что делает ее привлекательной для создания приложений, которые будут выполняться на платформах Unix и DOS.
Возможности управления терминалами с помощью библиотеки S-Lang можно разделить на две категории. Во-первых, библиотека предлагает набор функций для управляемого считывания нажатий клавиш из терминала. Во-вторых, она содержит набор подпрограмм для полноэкранного вывода на терминал. Многие возможности терминалов будут недоступными для программистов, однако функциональными возможностями каждого терминала можно будет воспользоваться [168] . В этой главе вы узнаете о том, каким образом можно использовать библиотеку S-Lang применительно ко всем этим функциональным возможностям, а в конце главы вам будет предложен пример
программы для закрепления материала.
168
Как это описано в базе данных
terminfo
.
24.1. Обработка ввода
Подсистема управления вводом на терминалах является одной из наименее доступных подсистем в мире Unix.
Широко распространенными подсистемами являются BSD sgtty, System termio, a также POSIX termios. За работу по управлению входными данными в библиотеке S-Lang отвечают несколько функций, предназначенных специально для того, чтобы сделать обработку данных, поступающих с клавиатуры, более простой и доступной.
Чтобы написать программу для посимвольного чтения из терминала и вывода каждого символа в отдельной строке потребуется несложный код.
1: /* slecho.c */
2:
3: #include <ctype.h>
4: #include <slang/slang.h>
5: #include <stdio.h>
6:
7: int main(void) {
8: char ch = '\0';
9:
10: /*
11: Начать обработку SLANG tty со следующими параметрами:
12: -1 символ прерывания по умолчанию (обычно Ctrl-C)
13: 0 управление потоком не производится; все символы (кроме
14: символа прерывания) будут переданы в программу 1 разрешение
15: обработки выходных данных OPOST управляющих последовательностей
Эта программа предполагает, что все заголовочные файлы S-Lang содержатся в каталоге
/usr/include/slang
. Если в вашей системе они находятся в другом каталоге, то тогда следует изменить соответствующим образом код (это касается всех примеров в этой главе). Для компилирования и компоновки этой программы в команду компоновки потребуется добавить
– lslang
, чтобы компоновщик мог найти функции S-Lang.
24.1.1. Инициализация обработки ввода в S-Lang
Прежде чем какая-либо функция обработки входных данных сможет работать, с помощью функции
Slang_init_tty
нужно перевести терминал в состояние, которое ожидается S-Lang:
int SLang_init_tty(int abort_char, int flow_ctrl, int opost);
Первый параметр функции
Slang_init_tty
определяет символ, который будет использован для прекращения работы. При передаче значения
– 1
будет сохранен текущий символ прерывания tty (обычно, <Ctrl+C>); в противном случае символу прерывания будет назначено переданное значение. Каждый раз при вводе на терминале символа прекращения работы ядро посылает сигнал
SIGINT
тому процессу, который обычно завершает работу приложения. В главе 12 мы рассказывали о том, как производится обработка сигналов, подобных