在WSL中保留规范模式(进入原始/折断模式)

时间:2019-05-24 09:01:20

标签: c windows-subsystem-for-linux tty termios

如何在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控制台的错误,还是某些需要解决方法的特定于平台的行为?

0 个答案:

没有答案