Выход из канонического режима (вход в режим raw / cbreak) в WSL - PullRequest
0 голосов
/ 24 мая 2019

Как войти в режим raw или cbreak под WSL?Я хочу, чтобы ввод с клавиатуры был доступен для ввода в stdin немедленно, вместо ожидания ввода.

Я пытался использовать termios, чтобы перевести TTY в необработанный или канонический режим, либо с помощью cfmakeraw, либо используя различные флаги, следуя примеру на странице справочника termios и нескольких вариантах (отключение только ICANON, код, аналогичный внутренним компонентам ncurses и т. д.):

           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;

Я устанавливаю VMIN в 1 и *От 1009 * до 0, а также с помощью fcntl, чтобы разрешить чтение из стандартного ввода без блокировки, когда в буфере нет данных (fcntl(0, F_SETFL, O_NONBLOCK), который, кажется, работает правильно).

Кроме этого, я такжепопробовал просто выполнить оболочку stty cbreak и stty raw.Такие вещи работают на компьютере Debian, но не работают на Debian, работающем под WSL - мои нажатия клавиш не отображаются при чтении из stdin.

В частности, есть две проблемы: если ICRNL not отключен, и я нажимаю клавишу, а затем достаточно быстро нажимаю Enter , ключ будет считан на стандартном вводе.Но 1) ввод не требуется в режиме raw или cbreak, и 2) если что-либо записывается в стандартный вывод перед чтением ввода, то все в буфере исчезает до его чтения.

Это ошибка с WSLконсоль, или какое-то специфичное для платформы поведение, требующее обходного пути?

...