Основы программирования в 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
Поделиться:
Популярные книги
Измена. Я отомщу тебе, предатель
1. Измены
Любовные романы:
современные любовные романы
5.75
рейтинг книги
Сводный гад
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Мимик нового Мира 6
5. Мимик!
Фантастика:
юмористическая фантастика
попаданцы
рпг
5.00
рейтинг книги
Идеальный мир для Лекаря 2
2. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Начальник милиции
1. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Магия чистых душ
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Темный Патриарх Светлого Рода 4
4. Темный Патриарх Светлого Рода
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Стрелок
5. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
На границе империй. Том 6
6. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.31
рейтинг книги
Архил…? Книга 3
3. Архил...?
Фантастика:
фэнтези
попаданцы
альтернативная история
7.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Лорд Системы 11
11. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Черный Маг Императора 5
5. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний попаданец 2
2. Последний попаданец
Фантастика:
юмористическая фантастика
попаданцы
рпг
7.50