管道(无名管道)通信机制原理和实现详解

  • 内容
  • 评论
  • 相关

管道(pipe)允许两个进程进行通信,是早期 UNIX 系统最早使用的一种 IPC 机制。管道为进程之间的相互通信提供了一种较为简单的方法,尽管也有一定的局限性。

在实现管道时,应该考虑以下四个问题:

  1. 管道允许单向通信还是双向通信?
  2. 如果允许双向通信,它是半双工的(数据在同一时间内只能按一个方向传输)还是全双工的(数据在同一时间内可在两个方向上传输)?
  3. 通信进程之间是否应有一定的关系(如父子关系)?
  4. 管道通信能否通过网络,还是只能在同一台机器上进行?

有两种常见类型的用于 UNIX 和 Windows 系统的管道:无名管道(普通管道)和有名管道,本节先讲解无名管道。

无名管道(普通管道)

普通管道允许两个进程按标准的生产者-消费者方式进行通信:生产者向管道的一端(写入端)写,消费者从管道的另一端(读出端)读。

因此,普通管道是单向的,只允许单向通信。如果需要双向通信,那么就要采用两个管道,而每个管道向不同方向发送数据。

下面我们讨论在 UNIX 和 Windows 系统上创建普通管道。在这两个程序实例中,一个进程向管道中写入消息 Greetings,而另一个进程从管道中读取此消息。

在 UNIX 系统上,普通管道的创建采用函数

pipe (int fd[])

这个函数创建一个管道,以便通过文件描述符 int fd[] 来访问:fd[0] 为管道的读出端,而 fd[1] 为管道的写入端。UNIX 将管道作为一种特殊类型的文件。因此,访问管道可以采用普通的系统调用 read() 和 write()。

普通管道只能由创建进程所访问。通常情况下,父进程创建一个管道,并使用它来与其子进程进行通信(该子进程由 fork() 来创建)。正如《进程的创建》一节所讲的那样,子进程继承了父进程的打开文件。由于管道是一种特殊类型的文件,因此子进程也继承了父进程的管道。



图 1 普通管道的文件描述符

本文标题:管道(无名管道)通信机制原理和实现详解

本文地址:http://www.hosteonscn.com/3569.html

评论

0条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注