有名管道(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(),可进行有名管道的通信。
在命令 ls 和命令 more 之间(作为两个独立的进程运行)设置一个管道,以便允许将 ls 的输出作为 more 的输入,从而用户就能一次一屏地显示一个长的目录列表。在命令行上,管道用字符“ | ”来表示。完整命令如下:
Windows 为 DOS 外壳提供了一个命令 more,其功能与 UNIX 的类似。DOS 外壳也釆用“|”来表示管道。唯一不同的是,要得到一个目录列表,DOS 利用命令 dir 而不是 ls,如下所示:
有名管道提供了一个更强大的通信工具。通信可以是双向的,并且父子关系不是必需的,当建立了一个有名管道后,多个进程都可用它通信。
事实上,在一个典型的场景中,一个有名管道有几个写者。此外,当通信进程完成后,有名管道继续存在。虽然 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
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算