1、pipe
本质:
- 匿名管道
- 内核缓冲区
- 伪文件(伪文件和操作文件类似)
创建方式:
#include <unistd.h>
int pipe(int fd[2]);
- fd[0] 表示读端
- fd[1] 表示写端
返回值:
成功返回0,失败返回-1
特点:
- 有读端和写端,对应两个文件描述符,数据从写端流入,读端流出
- 操作管道的进程挂掉后管道自动释放
- 管道默认是阻塞的
管道原理:
- 实现方式:环形队列 (先进先出)
- 缓冲区大小:4k (大小会根据实际情况做适当调整) (ulimit -a)
管道的局限:
- 管道中的数据只能读取一次,不能重复读取
- 半双工工作模式
使用场景:
- 有血缘关系的进程间通信
注意事项:
- 在一个进程里操作同一个管道时,读时关闭写端,写时关闭读端(避免自己写,自己读数据)
2、fifo
本质:
- 有名管道(在磁盘上有一个管道文件)
- 伪文件(大小永远为0)
- 在内核有对应的缓冲区
创建方式:
- 直接用命令创建在磁盘上:mkfifo name
- 在程序中创建:
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
参数说明:
- pathname:文件名
- mode:管道文件的权限(注:实际权限是 mode & ~umask)
返回值:
- 成功返回0, 失败返回-1
使用场景:
- 用于没有血缘关系的进程间通信
操作方式:
- 用IO函数操作(open/close)、(read/write)
进程间通信:
- a.c (read -> fifo) 如果管道没有东西,会处于阻塞状态
- b.c (write -> fifo) 如果管道内有东西没有读取完,会处于阻塞状态