ARTICLE — POSTS

匿名管道

本质

存在于内核内存中的虚拟文件系统,属于进程的资源,内部使用引用计数

特性

  • 数据单向流动
  • 可跨进程

大小

可以通过以下命令查看

$ 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 {
}