我正在尝试在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)
}
}
}
但是它没有按预期工作
我仍然可以看到回显的值,
我在做错什么,有人可以指出我或指导我吗?
答案 0 :(得分:0)
问题出在tcsetattr - parameters
err = unix.IoctlSetTermios(STDINFILENO, unix.TCSAFLUSH, &rawState)
通过操作TCSAFLUSH
,
DOC建议:
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
直到输出写入{ {1}}(“从站” pty)。
将动作更改为shell
会立即关闭回显。