我正试图关闭终端中的回声,在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)
}
}
}
但它没有按预期工作
我仍然能够看到回声值,
我做错了什么,有人可以指出我或指导我吗?
问题出在tcsetattr - parameters
err = unix.IoctlSetTermios(STDINFILENO, unix.TCSAFLUSH, &rawState)
上
随着行动TCSAFLUSH
,
DOC SUGGEST:
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
立即扭转了回声。