猿问

关闭终端中的回显 - Golang

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

        }


    }

}

但它没有按预期工作


我仍然能够看到回声值,

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



幕布斯7119047
浏览 174回答 1
1回答

呼啦一阵风

问题在于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 立即关闭回声。
随时随地看视频慕课网APP

相关分类

Go
我要回答