为了账号安全,请及时绑定邮箱和手机立即绑定

关闭终端中的回显 - Golang

关闭终端中的回显 - Golang

Go
幕布斯7119047 2023-03-29 17:21:29
我正在尝试关闭终端中的回声,在 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)        }    }}但它没有按预期工作我仍然能够看到回声值,我做错了什么,有人可以指出我或指导我吗?
查看完整描述

1 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

问题在于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 立即关闭回声。


查看完整回答
反对 回复 2023-03-29
  • 1 回答
  • 0 关注
  • 172 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信