Linux0.11设计了两套机制来实现进程间通信的合理要求。一套是管道机制,另一套是信号机制。今天主要讲的是管道机制,在管道机制中,每个管道允许两进程交互数据,一个进程向管道输入数据,另一个进程从管道中输出数据,如下图所示:
操作系统在内存中为每个管道开辟一页内存,给这页内存赋予了文件的属性。这一页由两个进程共享,但不会分配给任何进程,只由内核掌控。本质上,管道是一页内存。但进程要以操作文件的方式操作管道,这要求管道具备一些文件属性减少页属性。
文件属性:创建管道相当于创建文件,管道文件是为了两个进程使用而创建的,因此需要将两进程的*filp[20]与file_table[64](在上一篇博客介绍文件系统中有提到)的两项挂接,进程想要具备操作管道文件的能力,还要建立管道文件i节点与file_table[64]的关系。系统申请一个空闲内存页面,并将该页面地址载入i节点,并将i节点引用计数设为2,一个是读进程,一个数写进程。将file_table[64]的两个空闲项都指向这个管道文件,并将第一个空闲项的文件模式设为读,第二个设为写。最后返回管道文件的两个句柄给用户进程。
减少页属性:页内存毕竟要当个文件使用,那么要求进程不能像访问自己数据一样访问它,因此不能映射到进程的线性地址空间。再如,两个进程操作这个页,也不能产生写时复制,否则无法共享管道。