17.进程-无名管道

无名管道适合有亲缘关系的进程(通常是父子进程)间通信了;

实际上,你或多或少的都用过管道这种通信方式,比如你在使用的 linux 命令中的管道连接符 |;

什么是管道

之前提到过的,使用本地文件进行进程间通信的方式,那么就可以把管道理解成位于进程的内核空间的“文件”;

17.进程-无名管道_第1张图片

给文件加引号,是因为它和文件确实很像,因为它也有描述符。但是它确实又不是普通的本地文件,而是一种抽象的存在;

当进程使用 pipe 函数,就可以打开位于内核中的这个特殊“文件”。同时 pipe 函数会返回两个描述符,一个用于读,一个用于写。如果你使用 fstat函数来测试该描述符,可以发现此文件类型为 FIFO;

而无名管道的无名,指的就是这个虚幻的“文件”,它没有名字;

本质上,pipe 函数会在进程内核空间申请一块内存(比如一个内存页,一般是 4KB),然后把这块内存当成一个先进先出(FIFO)的循环队列来存取数据,这一切都由操作系统帮助我们实现了;

17.进程-无名管道_第2张图片

传统上pipe管道只能用于半双工通信(即一端只能发,不能收;而另一端只能收不能发),为了安全起见,各个进程需要把不用的那一端关闭(本质上是引用计数减 1),即每个pipe有两个描述符,一个用于读,一个用于写,关闭其中一个;

如果要实现全双工的通信,可以采用两个pipe管道;

你可能感兴趣的:(操作系统,计算机网络)