Отключить эхо в терминале - Голанг - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь отключить эхо в терминале, на Голанге,

Код:

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 голосов
/ 07 сентября 2018

Проблема была с 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 в этом случае не был выключен, пока вывод не был записан в shell ( «Раб» (pty)

Изменение действия на TCSANOW - the change shall occur immediately немедленно отключило эхо.

...