进程之间的管道是使用第一个进程的输出作为其他进程的输入的简单方法。这可以在Go中执行相同的概念,例如,将数据从一个套接字传输到另一个套接字,以创建隧道连接。本文将向你展示如何使用Go内置库创建管道。
writer和reader之间的管道
Golang 版本
1.12.1
前言
进程之间的管道是使用第一个进程的输出作为其他进程的输入的简单方法。这可以在Go中执行相同的概念,例如,将数据从一个套接字传输到另一个套接字,以创建隧道连接。本文将向你展示如何使用Go内置库创建管道。
实现
package main
import (
"io"
"log"
"os"
"os/exec"
)
func main() {
pReader, pWriter := io.Pipe()
cmd := exec.Command("echo", "Hello Go!\nThis is example")
cmd.Stdout = pWriter
go func() {
defer pReader.Close()
if _, err := io.Copy(os.Stdout, pReader); err != nil {
log.Fatal(err)
}
}()
if err := cmd.Run(); err != nil {
log.Fatal(err)
}
}
$ go run main.go
Hello Go!
This is example
原理
io.Pipe
函数创建内存管道并返回管道的两端,一侧是PipeReader
,另一侧是PipeWriter
。 每个Write到PipeWriter都被阻塞,直到另一端被Read
消耗为止。
该示例显示从执行的命令到父程序的标准输出的管道输出。通过将pWriter
分配给cmd.Stdout
,子进程的标准输出被写入管道,goroutine
中的io.Copy
通过将数据复制到os.Stdout
来消耗写入的数据。