如何在WSL下进入原始模式或cbreak模式?我希望键盘输入可立即用于stdin,而不是等待Enter键。
我已经尝试过使用termios将TTY设置为原始或规范模式,方法是使用cfmakeraw
或摆弄各种标志,方法是按照termios手册页上的示例和几个变体(仅禁用{{ 1}},类似于ncurses内部的代码,等等):
ICANON
我将 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;
设置为1,将VMIN
设置为0,并且还使用VTIME
允许从stdin进行读取而不会在缓冲区中没有数据时阻塞(fcntl
,这似乎正常工作。)
除此之外,我还尝试过简单地执行shell fcntl(0, F_SETFL, O_NONBLOCK)
和stty cbreak
。这类事情在Debian机器上可以运行,但是在WSL下运行的Debian上却不能运行-从stdin读取时我的按键不显示。
具体来说,存在两个问题:如果未禁用stty raw
,并且我按了一个键,然后足够快地按Enter键,则该键将被读取在stdin上。但是1)在原始或cbreak模式下不需要输入,并且2)如果在读取输入之前将任何内容写入stdout,则缓冲区中的任何内容在读取之前都会消失。
这是WSL控制台的错误,还是某些需要解决方法的特定于平台的行为?