gpt4 book ai didi

go - 关闭终端中的回显 - Golang

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:40 24 4
gpt4 key购买 nike

我正在尝试关闭 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)
}

}
}

但它没有按预期工作

我仍然能够看到回显值,

enter image description here

我做错了什么,有人可以指出我或指导我吗?

最佳答案

问题出在 tcsetattr - parameterserr = unix.IoctlSetTermios(STDINFILENO, unix.TCSAFLUSH, &rawState)

使用 TCSAFLUSH 操作,

DOC建议:

TCSADRAIN
等到所有排队的输出都被写入后,再进行更改。在更改影响输出的参数时,通常应使用此选项。
TCSA冲洗
这类似于 TCSADRAIN,但也会丢弃任何排队的输入。

所以 termios 在上面的例子中将字符发送回左边(“master” pty),因为在这种情况下 ECHO 直到输出被写入 shell(“从属”pty)。

将操作更改为 TCSANOW - 更改应立即发生 立即关闭回显。

关于go - 关闭终端中的回显 - Golang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52214856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com