进程间通讯就像现实中的管道一样,有一个进程进行写操作,其余的进程进行读操作。如果管道为空则read操作会阻塞,如果管道为满则write操作会阻塞。因此这里我们就引入了管道(pipe)
管道的特点:通讯数据遵循先进先出的原则,并且都是半双工通信原则,写入管道数据在内存存放。
分类:管道分为两种,有名管道和无名管道。
1、有名管道和无名管道的区别
有名管道:可以在任意进程之间进行通讯,通讯是双向的,任意一段都可读可写,但同一时间只能一端读一端写。有名管道是建立在实际的磁盘介质或文件系统(而不是只存在于内存中)上有自己名字的文件,任何进程可以在任何时间通过文件名或路径名与该文件建立联系。为了实现有名管道,引入了一种新的文件类型——FIFO文件(遵循先进先出的原则)。
实现一个有名管道实际上就是实现一个FIFO文件。有名管道一旦建立,之后它的读、写以及关闭操作都与普通管道完全相同。虽然FIFO文件的inode节点在磁盘上,但是仅是一个节点而已,文件的数据还是存在于内存缓冲页面中,和普通管道相同。
无名管道:只能在具有亲属关系的进程(父子进程)间通讯,不能再网络间通讯,并且是单向的,只能一端读另一端写。
2、管道的内核实现方式
管道是由内核管理的一个缓冲区
管道的一端连接一个进程的输出,这个进程会向管道中放入信息
管道的另一端连接一个进程的输入,这个进程取出被放入管道中的信息
一个缓冲区不需要很大,一般为4K大小,它被设计成为唤醒的数据结构,以便管道可以被循环利用
管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息
当管道被放满信息的时候,尝试放入信息的进程会等待,直到另一端的进程取出信息
当两个进程都终结的时候,管道就会自动消失