首页 > 编程笔记 > 操作系统笔记 阅读:745

有名管道(FIFO)通信机制完全攻略

无名管道提供了一个简单机制,允许一对进程通信。然而,只有当进程相互通信时,普通管道才存在。对于 UNIX 和 Windows 系统,一旦进程已经完成通信并且终止了,那么普通管道就不存在了。

有名管道提供了一个更强大的通信工具。通信可以是双向的,并且父子关系不是必需的,当建立了一个有名管道后,多个进程都可用它通信。

事实上,在一个典型的场景中,一个有名管道有几个写者。此外,当通信进程完成后,有名管道继续存在。虽然 UNIX 和 Windows 系统都支持有名管道,但是实现细节具有很大不同。下一步,我们探索这些系统的有名管道。

对于 UNIX,有名管道为 FIFO。一旦创建,它们表现为文件系统的典型文件。通过系统调用 mkfifo(),可以创建 FIFO,通过系统调用 open()、read()、write()和close(),可以操作 FIFO。

FIFO 会一直存在,直到它被显式地从文件系统中删除。虽然 FIFO 允许双向通信,但只允许半双工传输(数据在同一时间内只能按一个方向传输)。如果数据要在两个方向上传输,那么通常使用两个 FIFO。此外,通信进程应位于同一台机器上。如果需要不同系统之间的通信,那么应使用套接字。

与 UNIX 系统相比,Windows 系统的有名管道通信机制更加丰富。允许全双工通信(数据在同一时间内可在两个方向上传输),并且通信进程可以位于同一机器或不同机器。

此外,UNIX 的 FIFO 只支持字节流的数据,而 Windows 系统允许字节流或消息流的数据。通过函数 CreateNamedPipe(),可创建有名管道;通过函数 ConnectNamedPipe(),客户可连接到有名管道。通过函数 ReadFile() 和 WriteFile(),可进行有名管道的通信。

管道使用

在使用 UNIX 命令行的情况下,管道经常用于将一个命令的输出作为另一个命令的输入。例如,UNIX 命令 ls 可以生成一个目录列表。对于特别长的目录列表,输出可以有多个屏幕的长度。命令 more 管理输出,一次一屏地显示输出;用户通过按动空格键,一屏一屏地移动。

在命令 ls 和命令 more 之间(作为两个独立的进程运行)设置一个管道,以便允许将 ls 的输出作为 more 的输入,从而用户就能一次一屏地显示一个长的目录列表。在命令行上,管道用字符“ | ”来表示。完整命令如下:

ls | more

在这种情况下,命令 ls 作为生产者,而命令 more 作为消费者。

Windows 为 DOS 外壳提供了一个命令 more,其功能与 UNIX 的类似。DOS 外壳也釆用“|”来表示管道。唯一不同的是,要得到一个目录列表,DOS 利用命令 dir 而不是 ls,如下所示:

dir | more

所有教程

优秀文章