我有一个Go流程,通过管道接受输入.
tail -f something.foo | 去运行myprog.go
由于stdin是管道的输出,我找不到在myprog.go中读取键盘输入的方法.这可能吗?
我考虑在myprog.go中执行tail命令,但是我想避免在myprog.go崩溃并且无法终止另一个进程时创建另一个进程.
在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
}
}
}
Run Code Online (Sandbox Code Playgroud)
哪个可以输出:
$ echo HELLO | ./tty_reader
FROM STDIN:HELLO
typing on my keyboard
FROM TTY:typing on my keyboard
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
162 次 |
最近记录: |