1️⃣ 定义
匿名管道(anonymous pipe)
-
描述 :一种无文件名的、临时存在于内存的单向数据通道。
-
特点:
- 生命周期仅存在于创建它的进程及其子进程之间。
- 多用于有亲缘关系的进程通信(父子进程)。
- Shell 中的
|
就是典型匿名管道。
-
创建方式:
- C语言中
pipe(fd)
系统调用 - Shell:
cmd1 | cmd2
- C语言中
有名管道(named pipe / FIFO)
-
描述 :一种在文件系统有名字的管道文件,本质是 FIFO 先进先出通信机制。
-
特点:
- 可供无亲缘关系的进程通信(只要有路径名)。
- 名称存在于磁盘,但读写数据走内核缓冲,不落入磁盘。
- 单向通信(双向需两个 FIFO)。
-
创建方式:
- Shell:
mkfifo filename
- C语言:
mkfifo()
系统调用
- Shell:
普通文件(regular file)
-
描述:常规的存储文件,用于持久化数据。
-
特点:
- 数据保存在磁盘(或 SSD 等介质)。
- 可随机访问,支持
lseek
。 - 生命周期可长久存在,直至删除。
2️⃣ 核心功能特性对比
特性 | 匿名管道 | 有名管道(FIFO) | 普通文件 |
---|---|---|---|
是否有文件名 | 否 | 有(路径名) | 有 |
进程关系要求 | 必须有亲缘关系(父/子) | 无亲缘关系也可通信 | 无要求 |
数据流向 | 单向(半双工) | 单向(半双工) | 双向可读可写 |
存储位置 | 内核内存缓冲区 | 内核内存缓冲区 | 磁盘/存储设备 |
数据是否持久化 | 否,读走就消失 | 否,读走就消失 | 是,存到介质 |
生命周期 | 进程结束即消失 | 删除 FIFO 文件前一直存在 | 删除文件前一直存在 |
阻塞特性 | 默认阻塞(需读写两端配合) | 默认阻塞(需读写两端配合) | 读写互不依赖(除非文件锁) |
访问方式 | 顺序读写(不能 lseek ) |
顺序读写(不能 lseek ) |
顺序/随机访问均可 |
使用场景 | 临时父子进程数据传输 | 长期运行程序间通信 | 存储与读取数据 |
创建方式(Shell) | mkfifo fifo_name |
||
文件类型标识(ls -l) | 不在文件系统显示 | p (pipe) |
- (regular file) |
3️⃣ 图解类比
类比:
- 匿名管道 :
临时搭一条塑料软管,直接连两个机器,中间没有名字,任务结束软管拆掉。 - 有名管道 :
在墙上安装一个固定的水管接口(有标签/名字),任何人把软管接上都能用。 - 普通文件 :
把水装在水桶(硬盘)里,等什么时候要用再去取。