Comments 12
Там много ещё нужно. Например 8битный ввод включить, эхо отключить… Насколько я помню, макросы не на всех позикс-совместимых системах делают все нужное.
Флаг эхо я в примере обнулил, просто не акцентировал внимание
И я не особо понимаю о каких Вы макросах говорите
И я не особо понимаю о каких Вы макросах говорите
если не путаю, то ICANON — это макрос. Если нужно, то завтра глянул.
ICANON как раз просто однобитовый флаг.
Макросы (или функции) это cfsetspeed, cfmakeraw, а вот аналогичного макроса для канонического режима я не видел.
В ncurses есть noraw() и nocbreak(), возвращающие терминал в cooked mode.
Макросы (или функции) это cfsetspeed, cfmakeraw, а вот аналогичного макроса для канонического режима я не видел.
В ncurses есть noraw() и nocbreak(), возвращающие терминал в cooked mode.
Про ICANON — возможно, вы правы. Мне помнится, что на одном из *nix это был макрос — несколько битов по «или». Но на каком (FreeBSD, QNX, Unix) не помню. На linux — точно бит. Впрочем, с Unix я работал 30 лет назад, может и перепутал.
В *nix (линуксе, FreeBSD, QNX как минимум) есть cfmakeraw.
Глянул в свой код — кроме cfmakeraw идет возня со скоростью, битами четности и ASYNC_SPD_MASK — то есть то, что вам не нужно. Так что изменяемых cfmakeraw битов вам действительно хватит.
В *nix (линуксе, FreeBSD, QNX как минимум) есть cfmakeraw.
описание изменяемых битов
cfmakeraw меняет атрибуты терминала таки образом:
termios_p->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
|INLCR|IGNCR|ICRNL|IXON);
termios_p->c_oflag &= ~OPOST;
termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
termios_p->c_cflag &= ~(CSIZE|PARENB);
termios_p->c_cflag |= CS8;
Глянул в свой код — кроме cfmakeraw идет возня со скоростью, битами четности и ASYNC_SPD_MASK — то есть то, что вам не нужно. Так что изменяемых cfmakeraw битов вам действительно хватит.
Даешь консольный Xonix в массы!!!
Мелкие замечания по отдельным моментам:
> Однако второй из них по сути является улучшенной версией первого и полезен при работе с несколькими потоками.
Вообще, как раз poll — это улучшенная версия select. Select негарантированно масштабируется и поддерживает только три типа наблюдения. Poll был введён для устранения явных недостатков select.
> Под спойлером самая простая его реализация, далеко не самая защищенная, но вполне работающая на любой ОС с поддержкой стандартов POSIX.
BSD системы тоже поддерживают тут POSIX полностью, но детали реализации у них совсем другие (номера сисколлов / параметров ioctl, смещения в структуре termios и т.п.) Ваш код будет работать только для Linux/x86_64.
> Так как у нас всего один поток, то возвращаемое значение равно либо 1 (есть введенные данные), либо 0 (таковых нет).
Select и poll ещё могут быть прерваны сигналом, надо проверять rax на -EINTR. Ну и другие ошибки могут быть, но совсем уж в необычных случаях.
> Однако второй из них по сути является улучшенной версией первого и полезен при работе с несколькими потоками.
Вообще, как раз poll — это улучшенная версия select. Select негарантированно масштабируется и поддерживает только три типа наблюдения. Poll был введён для устранения явных недостатков select.
> Под спойлером самая простая его реализация, далеко не самая защищенная, но вполне работающая на любой ОС с поддержкой стандартов POSIX.
BSD системы тоже поддерживают тут POSIX полностью, но детали реализации у них совсем другие (номера сисколлов / параметров ioctl, смещения в структуре termios и т.п.) Ваш код будет работать только для Linux/x86_64.
> Так как у нас всего один поток, то возвращаемое значение равно либо 1 (есть введенные данные), либо 0 (таковых нет).
Select и poll ещё могут быть прерваны сигналом, надо проверять rax на -EINTR. Ну и другие ошибки могут быть, но совсем уж в необычных случаях.
В качестве отчетности по практикуму по программированию на первом курсе ВМК, конечно, используется написание некоторой программы с применением ассемблера, но об играх там речь не идёт. Это было бы перебор.
Sign up to leave a comment.
Неканонический режим терминала и неблокирующий ввод на nasm