无名管道:
- 首先它是
内核空间
的实现机制; - 然后
只能用于亲缘进程间通信
; - 它在内核所占的
大小是64KB
; - 它采用
半双工
的通信方式; - 请勿使用
lseek函数
;
读写特点:
- 若读端
存在
写管道,那么有多少数据,就写多少数据,直到无名管道写满为止,此时会出现写阻塞
,当无名管道出现新的4KB空间
,写操作就会解除阻塞; - 若读端
不存在
写管道,会出现管道破裂
的情况; - 若写端
存在
读管道,那么有多少数据,就读多少数据,没有数据的时候,会出现阻塞等待
; - 若写端
不存在
读管道,有多少数据,就读多少,没有数据的时候,就会立即返回,即非阻塞
的状态; - 创建无名管道(pipe函数):
#include <unistd.h>
int pipe(int pipefd[2]);
有名管道:
区别于
无名管道,其可以用于任意进程间的通信
;- 同无名管道一样,也是
半双工的通信方式
; - 有名管道的大小也是
64KB
; - 也是
不能使用lseek函数
; - 其本质上,是在内存上,在文件系统上
只是一个标识
; - 有名管道会创建一个管道文件,只需要打开这个文件,进行相应的读写操作即可;
读写特点:
- 若读端
存在
写管道,那么有多少数据,就写多少数据,直到有名管道写满
为止,此时会出现写阻塞
; - 若读端
不存在
写管道,会出现两种情况
; - 第一种:
读端
没有打开,写端
在open函数
的位置阻塞; - 第二种:
读端
打开后关闭,会出现管道破裂
的现象; - 若写端
存在
读管道,那么有多少数据,就读多少数据,没有数据的时候,会出现阻塞等待
; - 若写端
不存在
读管道,也会出现两种情况
; - 第一种:
写端
没有打开,读端
在open函数
的位置阻塞; - 第二种:
写端
打开后关闭,有多少数据,就读多少,没有数据的时候,就会立即返回,即非阻塞的状态
; - 创建有名管道(mkfifo函数):
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);