Pull to refresh

Comments 12

Там много ещё нужно. Например 8битный ввод включить, эхо отключить… Насколько я помню, макросы не на всех позикс-совместимых системах делают все нужное.
Флаг эхо я в примере обнулил, просто не акцентировал внимание
И я не особо понимаю о каких Вы макросах говорите
если не путаю, то ICANON — это макрос. Если нужно, то завтра глянул.
ICANON как раз просто однобитовый флаг.

Макросы (или функции) это cfsetspeed, cfmakeraw, а вот аналогичного макроса для канонического режима я не видел.

В ncurses есть noraw() и nocbreak(), возвращающие терминал в cooked mode.
Про ICANON — возможно, вы правы. Мне помнится, что на одном из *nix это был макрос — несколько битов по «или». Но на каком (FreeBSD, QNX, Unix) не помню. На linux — точно бит. Впрочем, с Unix я работал 30 лет назад, может и перепутал.

В *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 битов вам действительно хватит.

Ну, во времена CP/M-80 я его именно на ассемблере писал, и горько плакал, когда после добавления заставки и фоновой музыки он стал больше килобайта (емнип).

Язык ассемблер не так страшен как его малюют. По моему, не плохая тема курсовика для студента МВК МГУ.
Мелкие замечания по отдельным моментам:

> Однако второй из них по сути является улучшенной версией первого и полезен при работе с несколькими потоками.

Вообще, как раз poll — это улучшенная версия select. Select негарантированно масштабируется и поддерживает только три типа наблюдения. Poll был введён для устранения явных недостатков select.

> Под спойлером самая простая его реализация, далеко не самая защищенная, но вполне работающая на любой ОС с поддержкой стандартов POSIX.

BSD системы тоже поддерживают тут POSIX полностью, но детали реализации у них совсем другие (номера сисколлов / параметров ioctl, смещения в структуре termios и т.п.) Ваш код будет работать только для Linux/x86_64.

> Так как у нас всего один поток, то возвращаемое значение равно либо 1 (есть введенные данные), либо 0 (таковых нет).

Select и poll ещё могут быть прерваны сигналом, надо проверять rax на -EINTR. Ну и другие ошибки могут быть, но совсем уж в необычных случаях.
UFO landed and left these words here

В качестве отчетности по практикуму по программированию на первом курсе ВМК, конечно, используется написание некоторой программы с применением ассемблера, но об играх там речь не идёт. Это было бы перебор.

Sign up to leave a comment.

Articles