普通管道提供了一种简单的机制,允许一对进程进行通信。然而,普通管道只有在进程彼此通信时才存在。在UNIX和Windows系统中,一旦进程完成了通信并终止了,普通管道就不复存在了。

具名管道(Named pipes)提供了一个更强大的通信工具。通信可以是双向的,并且不需要父子关系。一旦确定了具名管道(Named pipes),几个进程就可以使用它进行通信。事实上,在一个典型的场景中,一个具名管道(Named pipes)有多个写入端。此外,具名管道(Named pipes)在通信过程完成后仍然存在。UNIX和Windows系统都支持具名管道(Named pipes),尽管实现的细节差别很大。接下来,我们将在每个系统中探索具名管道(Named pipes)

具名管道(Named pipes)在UNIX系统中称为FIFOs。一旦创建,它们表现的就像是文件系统中的一个标准的文件 。FIFO是用mkfifo()系统调用创建的,并使用普通的open()、read()、write()和close()系统调用来操作。它将继续存在,直到它被显式地从文件系统中删除。虽然FIFO允许双向通信,但只允许半双工传输。如果数据必须双向传输,通常使用两个FIFOs。此外,通信进程必须驻留在同一台机器上。如果需要进行内部通信,则必须使用套接字(3.6.1节)。

Windows系统上的具名管道(Named pipes)比UNIX系统提供了更丰富的通信机制。允许全双工通信,通信进程可能位于相同或不同的机器上。此外,只有面向字节的数据才可以通过UNIX FIFO传输,而Windows系统允许使用字节或面向消息的数据。具名管道(Named pipes)是用CreateNamedPipe()函数创建的,客户端可以使用ConnectNamedPipe()连接到具名管道(Named pipes)。通过使用ReadFile()和WriteFile()函数,可以完成对具名管道(Named pipes)的通信。

管道实践

在UNIX命令行环境中,经常使用管道,在这种环境中,一个命令的输出作为另一个命令的输入。例如,UNIX ls命令会生成一个目录列表。对于特别长的目录列表,输出可以滚动几个屏幕。more命令通过每次只显示一个输出屏幕来管理输出;用户必须按下空格键从一个屏幕移到下一个屏幕。在ls和more命令之间设置管道(作为单独的进程运行),允许将ls的输出作为more的输入传递,使用户能够一次显示一个大的目录列表。可以使用 |字符在命令行上构造一个管道。 完整的命令:

ls | more

在这个场景中,ls命令充当生产者,它的输出被more命令消费。

Windows系统为DOS shell提供了more命令,其功能类似于UNIX版本。DOS shell还使用 | 字符来建立管道。唯一的区别是,要获得一个目录清单,DOS使用dir命令而不是ls,如下所示:

dir | more

results matching ""

    No results matching ""