关闭终端-Golang

时间:2018-09-07 03:29:49

标签: go terminal echo system ioctl

我正在尝试在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

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

1 个答案:

答案 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会立即关闭回显。