管道

基本概念

管道可以把一个命令的输出作为下一个命令的输入, 在命令行环境中通过符号 | 来表示,是一种进程间的单向通信形式,基于文件描述符实现。

工作原理

管道会创建了内存缓冲区,两个进程(命令)通过这个缓冲区通信。

创建管道

使用 | 创建管道时,Shell 会调 pipe() 来创建管道,包含两个文件描述符。

  • 写入端文件描述符:A
  • 读取端文件描述符:B

命令连接

  • 左侧命令:把标准输出(文件描述符 1)重定向到管道的写入端 A
  • 右侧命令:把标准输入(文件描述符 0)重定向到管道的读取端 B

数据流动

  • 实时数据传输:两边的命令会并行执行,不会等前一个命令结束。
  • 无临时文件:数据在内存中传递。
  • 缓冲区大小:取决于系统。

查看缓冲区大小

cat /proc/sys/fs/pipe-max-size
1048576

局限性

  • 单向通信:双向通信需要使用其他机制,如命名管道(FIFO)或套接字。
  • 缓冲区大小:如果缓冲区满了,上游命令会暂停。