个临时性的V F S索引节点指向内存中的一个物理页面。一个例程用于写管道,另一个用于从管道中读数据。从一
般读写普通文件的系统调用的角度来看,这种实现方法隐藏了下层的差异。当写进程执行写
管道操作时,数据被复制到共享的数据页面中;而读进程读管道时,数据又从共享数据页中复
制出来。L i n u x必须同步对管道的访问,使读进程和写进程步调一致。为了实现同步, L i n u x
使用锁、等待队列和信号量这三种方式。
写进程使用标准的写库函数来写管道。使用文件操作库函数要求传递文件描述符来索引
进程的文件数据结构集合。每个文件数据结构代表一个打开的文件或是一个打开的管道。
L i n u x写系统调用使用代表该管道的文件数据结构指向的写例程,而写例程又使用代表该管道
的V F S索引节点中保存的信息来管理写请求。
如果有足够大的空间把所有的数据写入管道中,并且该管道没有被读进程锁定,那么
L i n u x为写进程锁定管道,把待写的数据从进程空间复制到共享数据页中。如果管道被读进程
锁定或者没有足够大的空间存放数据,那么当前的进程被强制进入睡眠状态,放在管道对应
的索引节点的等待队列中,然后系统调用进程调度器来选择合适进程进入运行状态。睡眠的
进程是可中断的,它可以接收信号;也可以在管道中有足够大空间来容纳写数据或在管道被解
锁时,被读进程唤醒。写数据完成后,管道的V F S索引节点被解锁。系统会唤醒所有睡眠在
读索引节点等待队列中的读进程。
L i n u x也支持命名管道(named pipes) 。因为这种管道遵循先进先出的规则,所以它也被
称为F I F O (先进先出)管道。普通的管道是临时性的对象,而F I F O管道是通过m k f i f o命令创建
的文件系统中的实体。只要有适当的权限,进程就可以自由地使用F I F O管道。但F I F O管道
的打开方式与普通管道有所不同:普通管道(包括两个文件数据结构:对应的V F S索引节点以
及共享数据页)在进程每次运行时都会创建一次,而F I F O是一直存在的,需要用户打开和关
闭。L i n u x必须处理读进程先于写进程打开管道、读进程在写进程写入数据之前读入这两种
情况。除此之外, F I F O管道的使用方式与普通管道完全相同,都使作相同的数据结构和操
作。