管道
基本概念
管道可以把一个命令的输出作为下一个命令的输入, 在命令行环境中通过符号 |
来表示,是一种进程间的单向通信形式,基于文件描述符实现。
工作原理
管道会创建了内存缓冲区,两个进程(命令)通过这个缓冲区通信。
创建管道
使用 |
创建管道时,Shell 会调 pipe()
来创建管道,包含两个文件描述符。
- 写入端文件描述符:
A
。 - 读取端文件描述符:
B
。
命令连接
- 左侧命令:把标准输出(文件描述符
1
)重定向到管道的写入端A
。 - 右侧命令:把标准输入(文件描述符
0
)重定向到管道的读取端B
。
数据流动
- 实时数据传输:两边的命令会并行执行,不会等前一个命令结束。
- 无临时文件:数据在内存中传递。
- 缓冲区大小:取决于系统。
查看缓冲区大小
bash
cat /proc/sys/fs/pipe-max-size
bash
1048576
局限性
- 单向通信:双向通信需要使用其他机制,如命名管道(FIFO)或套接字。
- 缓冲区大小:如果缓冲区满了,上游命令会暂停。