Как войти в режим 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консоль, или какое-то специфичное для платформы поведение, требующее обходного пути?