Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

do {

 choice = getchoice("Please select an action", menu, input, output);

 printf("\nYou have chosen: %c\n", choice);

 sleep(1);

} while (choice != 'q');

Последняя функция в этой программе

char_to_terminal
включает в себя вызов функции
putc
, которую мы упоминали в главе 3.

В завершение этой главы

бегло рассмотрим пример определения нажатий клавиш.

Обнаружение нажатий клавиш

Пользователи, программировавшие в ОС MS-DOS, часто ищут в ОС Linux эквивалент функции

kbhit
, которая определяет, была ли нажата клавиша, без реального ее считывания. К сожалению, их поиски оказываются безуспешными, поскольку прямого аналога нет. Программисты в среде UNIX не ощущают этого отсутствия, т.к. UNIX запрограммирована так, что программы очень редко (если когда-либо вообще) озабочены ожиданием события. Поскольку это обычный способ применения
kbhit
, ее нехватка редко ощущается в системах UNIX и Linux.

Однако, когда вы переносите программы из MS-DOS, часто удобно эмулировать функцию

kbhit
, которую можно применять на деле в неканоническом режиме ввода (упражнение 5.7).

Упражнение 5.7. Исключительно ваша собственная
kbhit

1. Начните со стандартной заголовочной информации и пары структур для установки параметров терминала.

peek_character
применяется для проверки нажатия клавиши. Далее описываются функции, которые будут использоваться позже:

#include <stdio.h>

#include <stdlib.h>

#include <termios.h>

#include <term.h>

#include <curses.h>

#include <unistd.h>

static struct termios initial_settings, new_settings;

static int peek_character = -1;

void init_keyboard;

void close_keyboard;

int kbhit;

int readch;

2. Функция main вызывает функцию

init_keyboard
для настройки терминала, затем выполняет цикл один раз в секунду, каждый раз вызывая в нем функцию
kbhit
. Если нажата клавиша <q>, функция
close_keyboard
восстанавливает нормальный режим и программа завершается:

int main {

 int ch = 0;

 init_keyboard;

 while (ch != 'q') {

printf("looping\n");

sleep(1);

if (kbhit) {

ch = readch;

printf("you hit %c\n", ch);

}

 }

 close_keyboard;

 exit(0);

}

3. Функции

init_keyboard
и
close_keyboard
настраивают терминал в начале и конце программы:

void init_keyboard {

 tcgetattr(0, &initial_settings);

 new_settings = initial_settings;

 new_settings.c_lflag &= ~ICANON;

 new_settings.c_lflag &= ~ECHO;

 new_settings.c_lflag &= ~ISIG;

 new_settings.c_cc[VMIN] = 1;

 new_settings.c_cc[VTIME] = 0;

 tcsetattr(0, TCSANOW, &new_settings);

}

void close_keyboard {

 tcsetattr(0, TCSANOW, &initial_settings);

}

4. Теперь функция, проверяющая нажатие клавиши:

int kbhit {

 char ch;

 int nread;

 if (peek_character != -1) return 1;

 new_settings.c_cc[VMIN] = 0;

 tcsetattr(0, TCSANOW, &new_settings);

 nread = read(0, sch, 1);

 newrsettings.c_cc[VMIN] = 1;

 tcsetattr(0, TCSANOW, &new_settings);

 if (nread == 1) {

peek_character = ch;

return 1;

 }

 return 0;

}

5. Нажатый символ считывается следующей функцией

readch
, которая затем восстанавливает значение -1 переменной
peek_character
для выполнения следующего цикла:

int readch {

 char ch;

 if (peek_character != -1) {

ch = peek_character;

peek_character = -1;

return ch;

 }

 read(0, &ch, 1);

 return ch;

}

Когда вы выполните программу (kbhit.c), то получите следующий вывод:

$ ./kbhit

looping

looping

looping

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

Князь Андер Арес 2

Грехов Тимофей
2. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Князь Андер Арес 2

Я Гордый часть 6

Машуков Тимур
6. Стальные яйца
Фантастика:
фэнтези
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я Гордый часть 6

Стражи душ

Кас Маркус
4. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Стражи душ

Черный Маг Императора 18

Герда Александр
18. Черный маг императора
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный Маг Императора 18

Третий. Том 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 3

Цикл "Отмороженный". Компиляция. Книги 1-14

Гарцевич Евгений Александрович
Отмороженный
Фантастика:
боевая фантастика
рпг
постапокалипсис
5.00
рейтинг книги
Цикл Отмороженный. Компиляция. Книги 1-14

Хозяин Стужи 3

Петров Максим Николаевич
3. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
7.00
рейтинг книги
Хозяин Стужи 3

Имперец. Том 1 и Том 2

Романов Михаил Яковлевич
1. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Имперец. Том 1 и Том 2

Древесный маг Орловского княжества 3

Павлов Игорь Васильевич
3. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Древесный маг Орловского княжества 3

Кодекс Охотника. Книга ХХ

Винокуров Юрий
20. Кодекс Охотника
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга ХХ

Найденыш

Шмаков Алексей Семенович
2. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Найденыш

Третий. Том 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 4

На границе империй. Том 7. Часть 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 7. Часть 4

Мастер 8

Чащин Валерий
8. Мастер
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Мастер 8