在 golang 中,有一个实例io.ReadWriteCloser
如何获取其表示(代理类型)作为实例*os.File
(例如,为 提供exec.Cmd.ExtraFiles
)
首先想到的是使用os.Pipe
方法。但这样的存根仍然是单向的(只读或只写)。
那么如何完全表示io.ReadWriteCloser
为*os.File
Eg
func something(stream io.ReadWriteCloser) {
cmd := exec.Command("comm")
var wrapped *os.File = wrappAsFile(stream) // How this could be achieved?
cmd.ExtraFiles := []*File{wrapped}
}
我可以看到的简化解决方案如下所示。尽管如此(正如我之前提到的)它仅涵盖 Reader 流程。
func something(stream io.ReadWriteCloser) {
cmd := exec.Command("comm")
r, w, _ := os.Pipe()
go func() {
io.Copy(w, stream)
w.Close()
}()
cmd.ExtraFiles := []*File{r}
}
谢谢
如果您只能使用 POSIX 系统,则可以使用 a
socketpair
创建全双工管道:syscall.Socketpair
然后您可以
io.ReadWriteCloser
通过几个io.Copy
调用连接到:Windows 现在也支持 unix 域套接字,因此虽然不像套接字对那么方便,但您也可以创建 unix 套接字侦听器,然后拨打另一个套接字来创建连接并从该
File()
方法获取底层文件