Как стать автором
Обновить

Ожидание ввода символа в юниксовой консоли

Время на прочтение1 мин
Количество просмотров1.8K
В очередной раз столкнулся с проблемой блокирующего чтения символа из юниксовой консоли. Кто имел счастье писать на борландовском Паскале под DOS наверняка помнит функцию ReadKey(), блокирующую выполнение программы до нажатия эникея. У меня пару раз всплывало это требование и в юниксовой консоли, но сишная функция getchar() блокирует выполнение до нажатия Enter, что не очень желательно в некоторых случаях.

#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int main() {
    struct termios term;

    tcgetattr(STDIN_FILENO, &term);
    term.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, 0, &term);

    if (getchar()) {
        printf(«Hello world!»);
    }

    return 0;
}

Вся соль подхода в структуре termios, которая описывает параметры терминала. Поле c_lflag отвечает за так называемые локальные опции, т.е. за то, как вводимые символы будут обработаны драйвером.

Наш враг в данном случае — бит ICANON, отвечающий за выбор канонического или неканонического (raw) режима ввода. Канонический режим для stdin устанавливается по умолчанию и подразумевает, помимо всего прочего, строчный буфер, т.е. требование нажимать Enter каждый раз при желании скормить что-либо getchar(). Соответственно, требуется перевести stdin в неканонический режим.

Бит ECHO того же поля termios отвечает за эхо ввода, т.е., в данном случае, отображение на экране введенного символа. Убираем/оставляем по вкусу.
Теги:
Хабы:
Всего голосов 9: ↑6 и ↓3+3
Комментарии4

Публикации

Истории

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн