本质
存在于内核内存中的虚拟文件系统,属于进程的资源,内部使用引用计数
特性
- 数据单向流动
- 可跨进程
大小
可以通过以下命令查看
$ cat /proc/sys/fs/pipe-max-size
1048576 # 单位 byte, 1 MB
可以动态调整
阻塞/非阻塞
- 阻塞模式下,读/写 一个 写/读端 被关闭的管道会直接返回
- 非阻塞模式下, 读/写 立即返回
如何创建
A -> B
A 进程创建管道, fork 出子进程 B
fork 会让主进程和子进程共用同一个fd数组,此时A和B实现了进程间通信
为了保证管道中数据的单向流动, A 关闭 fdr(读), B 关闭 fdw(写)
go 中如何创建
fr, fw, err := os.Pipe() // 创建
if n, err := fw.WriteString(strings.Join(cmds, "\x00")); err != nil {} // 写入
_ = fw.Close() // 写完一定要及时关闭,防止接收方堵塞
// 读取
//
// 需要打开管道
// readingFd 为进程中管道文件描述符在fd数组中的索引
f := os.NewFile(readingFd, "pipe")
if f == nil {
}
data, err := io.ReadAll(f)
if err != nil {
}