提问人:404 提问时间:8/15/2023 更新时间:8/15/2023 访问量:113
Golang Non Blocking os.Stdin Read for Cmd
Golang Non Blocking os.Stdin Read for Cmd
问:
cmd := exec.Command("env")
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
无论命令在读取时不中继,这都很好用env
stdin
然而,对于
cmd := exec.Command("env")
reader, writer := os.Pipe()
go func() {
io.Copy(writer, os.Stdin)
reader.Close()
}()
cmd.Stdin = reader
cmd.Stdout = os.Stdout
它很好地执行命令,但接下来会阻止,直到进行任何输入(无论是否不需要它)env
env
即使这样也会重现这种情况
cmd := exec.Command("env")
cmd.Stdin = struct{io.Reader}{os.Stdin}
cmd.Stdout = os.Stdout
但这实际上在 Cmd 实现的引擎盖下再现了 Pipe 流,一旦 Stdin 不是 *os,它就会自己。文件(见代码 )
if f, ok := c.Stdin.(*os.File); ok {
return f, nil
}
pr, pw, err := os.Pipe()
if err != nil {
return nil, err
}
...
所以 wat 是这里作为 io 的基本区别。Copy 说它应该以同样的方式运行
Copy copies from src to dst until either EOF is reached on src or an error occurs
那么直接提供操作系统的区别是什么。Stdin 将其管道连接到中级阅读器上。以及如何使管道方法以相同的非阻塞方式运行
我的实际情况更加复杂,因为它将 stdin 管道输送到我希望的静止器上。对所描述的行为的理解将为我提供相同的解决方案线索。net.Conn
感谢。
答: 暂无答案
评论
os.Stdin
cmd.Stdin
os.Pipe
env
env < fifo