关闭终端中的回显 - Golang

问题描述 投票:-1回答:1

我正试图关闭终端中的回声,在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

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

go terminal echo system ioctl
1个回答
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立即扭转了回声。

© www.soinside.com 2019 - 2024. All rights reserved.