Библиотеку S-Lang можно использовать и для работы в DOS, что делает ее привлекательной для создания приложений, которые будут выполняться на платформах Unix и DOS.
Возможности управления терминалами с помощью библиотеки S-Lang можно разделить на две категории. Во-первых, библиотека предлагает набор функций для управляемого считывания нажатий клавиш из терминала. Во-вторых, она содержит набор подпрограмм для полноэкранного вывода на терминал. Многие возможности терминалов будут недоступными для программистов, однако функциональными возможностями каждого терминала можно будет воспользоваться [168] Как это описано в базе данных terminfo .
. В этой главе вы узнаете о том, каким образом можно использовать библиотеку S-Lang применительно ко всем этим функциональным возможностям, а в конце главы вам будет предложен пример программы для закрепления материала.
Подсистема управления вводом на терминалах является одной из наименее доступных подсистем в мире Unix.
Широко распространенными подсистемами являются BSD sgtty, System termio, a также POSIX termios. За работу по управлению входными данными в библиотеке S-Lang отвечают несколько функций, предназначенных специально для того, чтобы сделать обработку данных, поступающих с клавиатуры, более простой и доступной.
Чтобы написать программу для посимвольного чтения из терминала и вывода каждого символа в отдельной строке потребуется несложный код.
1: /* slecho.c */
2:
3: #include
4: #include
5: #include
6:
7: int main(void) {
8: char ch = '\0';
9:
10: /*
11: Начать обработку SLANG tty со следующими параметрами:
12: -1 символ прерывания по умолчанию (обычно Ctrl-C)
13: 0 управление потоком не производится; все символы (кроме
14: символа прерывания) будут переданы в программу 1 разрешение
15: обработки выходных данных OPOST управляющих последовательностей
16: */
17: SLang_init_tty(-1, 0, 1);
18:
19: while (ch != 'q') {
20: ch = SLang_getkey();
21: printf("чтение: %c 0x%x\n", isprint(ch) ? ch : ' ', ch);
22: }
23:
24: SLang_reset_tty();
25:
26: return 0;
27: }
Эта программа предполагает, что все заголовочные файлы 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 (обычно, ); в противном случае символу прерывания будет назначено переданное значение. Каждый раз при вводе на терминале символа прекращения работы ядро посылает сигнал SIGINT
тому процессу, который обычно завершает работу приложения. В главе 12 мы рассказывали о том, как производится обработка сигналов, подобных SIGINT
.
Следующий параметр отвечает за включение и отключение управления потоком. Управляя потоком на уровне терминала, пользователь может приостанавливать процесс вывода данных на терминал, не допуская прокрутки, а затем возобновлять его. Обычно для приостановления процесса вывода данных на экран используется и — для возобновления этого процесса. Хотя эта особенность удобна для некоторых утилит, ориентированных на работу со строками, программы, работающие с библиотекой S-Lang, обычно ориентированы на работу с экраном, поэтому она может оказаться излишней. S-Lang позволяет приложениям отключать эту функциональность, в результате чего программа сможет назначить нажатия клавиш Stop (Стоп) и Start (Пуск) для других команд. Чтобы включить управление потоками, функции SLang_init_tty()
необходимо передать ненулевое значение в качестве второго параметра.
Последний параметр разрешает заключительную обработку вывода на терминале. Любой механизм ядра, связанный с заключительной обработкой, будет включен, если последний параметр будет иметь ненулевое значение. Информацию об обработке выходных данных можно найти в главе 16.
Читать дальше