引用:GitHub - jiong1998/Linux-.github.io: Linux系统编程【文件IO、进程、进程间通信、信号、多线程、互斥】:个人源码+个人笔记
在进程间完成数据传递需要借助操作系统提供特殊的方法,现今常用的进程间通信方式有:
管道: PIPE、FIFO?(使用最简单)
? ? ? ? pipe(匿名管道)
? ? ? ? fifo(命名管道)
????????管道是一种最基本的IPC机制,也称匿名管道,应用于有血缘关系的进程之间,进行数据传递。调用pipe函数即可创建一个管道。
管道的特点
- 管道的本质是一块内核缓冲区 ,**数据只要读就没了。**(防止管道满)
- 由两个**文件描述符引用**,一个表示读端,一个表示写端。
- 规定数据从管道的写端流入管道,从读端流出。
- 当两个进程都终止的时候,管道也自动消失。
- <font color='red'> 管道的读端和写端默认都是**阻塞**的</font>
注意:父进程创建管道,子进程会继承。
**原理:**
- 管道内部使用**环形队列**实现。
- 默认缓冲区大小为4K,可以使用ulimit -a命令获取大小。
- 实际操作过程中缓冲区会根据数据压力做适当调整。
**局限性**:
- 数据一旦被读走,便不在管道中存在,**不可反复读取**。
- **数据只能在一个方向上流动**,若要实现双向流动,必须使用两个管道
- 只能在**有血缘关系的进程间**使用管道。
为什么管道只能在有血缘关系的进程间使用:
  管道的两端是通过文件描述符表示的,如果是两个毫不相关的进程,在一个进程内创建了管道,没办法让另一个进程获得该管道的文件描述符。但是在父子进程中就可以。
信号?(开销最小)
共享映射区 (无血缘关系)
本地套接字 (最稳定)