我正在尝试关闭终端中的回声,在 Golang 中,代码:func main() { STDINFILE := os.Stdin STDINFILENO := 0 raw, err := unix.IoctlGetTermios(STDINFILENO, unix.TCGETA) if err != nil { panic(err) } rawState := *raw rawState.Lflag &^= unix.ECHO err = unix.IoctlSetTermios(STDINFILENO, unix.TCSAFLUSH, &rawState) if err != nil { panic(err) } var charValue byte reader := bufio.NewReader(STDINFILE) for { var err error // read one byte charValue, err = reader.ReadByte() if err != nil { if err == io.EOF { fmt.Println("END OF FILE") } } // press q to quit. if charValue == 'q' { os.Exit(0) } }}但它没有按预期工作我仍然能够看到回声值,我做错了什么,有人可以指出我或指导我吗?
1 回答
呼啦一阵风
TA贡献1802条经验 获得超6个赞
问题在于tcsetattr - parameters
err = unix.IoctlSetTermios(STDINFILENO, unix.TCSAFLUSH, &rawState)
用行动TCSAFLUSH
,
文档建议:
TCSADRAIN
Make the change after waiting until all queued output has been written. You should usually use this option when changing parameters that affect output.
TCSAFLUSH
This is like TCSADRAIN, but also discards any queued input.
所以termios
在上面的例子中是将字符发送回左边(“主”pty),ECHO
在这种情况下直到输出被写入shell
(“从”pty)才关闭。
将动作更改为TCSANOW - the change shall occur immediately
立即关闭回声。
- 1 回答
- 0 关注
- 172 浏览
添加回答
举报
0/150
提交
取消