管道
A.What
本质是内核缓存区
B. 管道的特点
- 内核缓冲区大小固定位4k
- 管道独立于进程存在
- 管道的数据结构:环形队列(读端和写端)
- 单工:写端流向读端
- 读数据相当于出队列
- 默认阻塞:管道无数据,默认读端阻塞;管道写满,默认写端阻塞
C. Which(有哪些种类的管道)
有名管道
管道在磁盘上对应一个大小为0(因为它的本质是是内核中的一块缓冲区)的管道文件
匿名管道
匿名管道
没有名字,但本质仍然是内核中的一块缓冲区
区别
匿名管道只能实现有血缘关系进程之间的的通信
有名管道既能实现有血缘关系进程之间的通信,也能实现无血缘关系进程之间的通信
D. How(如何使用管道)
匿名管道
#include <unistd.h>
int fd[2];
pipe(fd); //fd是传出参数,表示管道的读端和写端
有名管道
#include <sys/types.h>
#include <sys/stat.h>
int ret = mkfifo("./fifo", 0644);
int fd = open("./fifo", O_WRONLY);
write(fd, pMsg, strlen(pt));
close(fd);
其中pt是一块内存(char类型数组)
从上面代码我们可以看出:对管道的操作和对文件的操作流程基本一致
E. 管道的读写行为
读管道
写端关闭的情况下:如果读端有数据,那么继续读数据,读完后返回0;如果读端无数据,那么返回0
写端未关闭的情况下:如果读端有数据,则一直读数据;如果读端无数据,则阻塞
写管道
读端关闭的情况下:管道破裂,进程直接退出
读端未关闭的情况下:管道被写满,则阻塞;管道未满,则一直写