****1. 管道的概念
管道,又名「无名管理」,或「匿名管道」,管道是一种非常基本,也是使用非常频繁的IPC方式。
1.1 管道本质
管道的本质也是一种文件,不过是伪文件,实际上是一块内核缓冲区,大小4K;
管道创建以后会产生两个文件描述符,一个是读端,另一个是写端;
管道里的数据只能从写端被写入,从读端被读出;
1.2 管道原理
管道是内核的一块缓冲区,更具体一些,是一个环形队列。数据从队列的一端写入数据,另一端读出,如下图示:
1.3 管道的优点
简单
1.4 管道的缺点
只能单向通信,如果需要双向通信则需要建立两个管道;
只能应用于具有血缘关系的进程,如父子进程;
缓冲区大小受限,通常为1页,即4k;
▋****2. 管道的创建
管道创建三步曲:
a. 父进程调用pipe函数创建管道;
b. 父进程调用fork函数创建子进程;
c. 父进程关闭fd[0],子进程关闭fd[1];
具体如下图所示:
▋****3. 管道的读写行为
a. 管道的缓冲区大小固定为4k,所以如果管道内数据已经写满,则无法再写入数据,进程的write调用将阻塞,直到有足够的空间再写入数据;
b. 管道的读动作比写动作要快,数据一旦被读走了,管道将释放相应的空间,以便后续数据的写入。当所有的数据都读完之后,进程的read()调用将阻塞,直到有数据再次写入。
▋****4. 例程
父子间通信:
兄弟间通信: