我有一个通过管道接受输入的Go进程。
tail -f something.foo something.foo go运行myprog.go
由于stdin是管道的输出,所以我找不到一种在myprog.go中读取键盘输入的方法。这个是可能的吗?
我考虑过在myprog.go内部执行尾命令,但我希望避免在myprog.go崩溃时创建另一个进程,并且无法终止另一个进程。
发布于 2015-04-02 19:07:02
在linux (和一般的POSIX )上,您可以打开/dev/tty来获取进程控制tty的输入。
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
}
}
}它可以输出:
$ echo HELLO | ./tty_reader
FROM STDIN:HELLO
typing on my keyboard
FROM TTY:typing on my keyboard发布于 2015-04-03 15:08:12
您可以使用shell创建一个管道,以便将输入到您的程序中,同时让stdin免费用于其他事情。在…的声音下
go run myprog.go <(tail -f something.foo)shell将执行tail并将它的标准输出重定向到一个新的fifo。您的程序接收fifo作为第一个参数,指向/proc/self/fd/1234567
https://stackoverflow.com/questions/29418868
复制相似问题