首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当stdin是其他东西时,Go程序能从键盘上读取吗?

当stdin是其他东西时,Go程序能从键盘上读取吗?
EN

Stack Overflow用户
提问于 2015-04-02 17:25:10
回答 2查看 351关注 0票数 0

我有一个通过管道接受输入的Go进程。

tail -f something.foo something.foo go运行myprog.go

由于stdin是管道的输出,所以我找不到一种在myprog.go中读取键盘输入的方法。这个是可能的吗?

我考虑过在myprog.go内部执行尾命令,但我希望避免在myprog.go崩溃时创建另一个进程,并且无法终止另一个进程。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-02 19:07:02

在linux (和一般的POSIX )上,您可以打开/dev/tty来获取进程控制tty的输入。

代码语言:javascript
复制
func readStdin() {
    buf := make([]byte, 1024)
    for {
        n, err := os.Stdin.Read(buf)
        if err != nil && err != io.EOF {
            log.Fatal(err)
        }
        fmt.Print("FROM STDIN:", string(buf[:n]))
        if err == io.EOF {
            return
        }
    }
}

func main() {
    go readStdin()

    buf := make([]byte, 1024)
    tty, err := os.Open("/dev/tty")
    if err != nil {
        log.Fatal(err)
    }
    defer tty.Close()
    for {
        n, err := tty.Read(buf)
        if err != nil && err != io.EOF {
            log.Fatal(err)
        }
        fmt.Print("FROM TTY:", string(buf[:n]))
        if err == io.EOF {
            return
        }
    }
}

它可以输出:

代码语言:javascript
复制
$ echo HELLO | ./tty_reader
FROM STDIN:HELLO
typing on my keyboard
FROM TTY:typing on my keyboard
票数 5
EN

Stack Overflow用户

发布于 2015-04-03 15:08:12

您可以使用shell创建一个管道,以便将输入到您的程序中,同时让stdin免费用于其他事情。在…的声音下

代码语言:javascript
复制
go run myprog.go <(tail -f something.foo)

shell将执行tail并将它的标准输出重定向到一个新的fifo。您的程序接收fifo作为第一个参数,指向/proc/self/fd/1234567

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29418868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档