从已有的进程创建新进程,其用途是有限的,它们无法进行进程间通信。进程间通信允许运行在同一CPU上的并且祖先相同的进程交换信息。最成熟的进程间通信的形式称为管道,它由两个档案描述符组成,一个用于读信息,另一个用于写信息。有两种管道:半双工和全双工。半双工管道仅能在一个方向上传递信息,而全双工管道可在两个方向上传递信息。
基本介绍
- 中文名:半双工管道
- 外文名:half-duplex pipe
- 定义:仅能在一个方向上传递信息的管道
- 作用:在两个进程之间实现一个数据流通
- 领域:电子信息
- 平台:Linux/UNIX系统
简介
管道是Linux/UNIX系统中比较原始的进程间通信形式,它实现数据以一种数据流的方式,在多进程间流动。在系统中其相当于档案系统上的一个档案,来快取所要传输的数据。管道通信是最常见的通信方式之一,其是在两个进程之间实现一个数据流通的管道,该管道可以是双向或单向的。
我们将仅能在一个方向上传递信息的管道称为半双工管道,将可在两个方向上传递信息的管道称为全双工管道。管道是一种很经典的进程之间的通信方式,其优点在于简单易用,其缺点在于功能简单,有很多限制。
管道及介绍
管道在某些特性上不同于档案,例如,当数据读出后,则管道中就没有数据了,但档案没有这个特性。
图1 管道图示

匿名半双工管道在系统中是没有实名的,并不可以在档案系统中以任何方式看到该管道。它只是进程的一种资源,会随着进程的结束而被系统清除。管道通信是在UNIX系统中套用比较频繁的一种方式,例如使用grep查找。其代码如下:
# ls | grep ipc
上述命令中使用的是半双工管道,即grep命令的输入是ls命令的输出。管道从数据流动方向上又分全双工管道以及半双工管道,当然全双工管道现在某些系统还不支持,其在具体的实现过程中也只是在档案打开的方式上有一点区别(在操作规则上也有一些不同,全双工管道要相比半双工複杂的多)。
匿名管道没有名字,对于管道中使用的档案描述符没有路径名,也就是不存在任何意义上的档案,它们只是在记忆体中跟某一个索引节点相关联的两个档案描述符。匿名半双工管道的主要特性如下:
● 数据只能在一个方向上移动。
● 只能在具有公共祖先的进程间通信,即或是父子关係进程间、或是在兄弟关係进程间通信。
儘管有如此限制,半双工管道还是最常用的通信方式。Linux环境下使用pipe函式创建一个匿名半双工管道,其函式原型如下:
#include<unisted.h>
int pipe(int fd[2]);
参数int fd[2]为一个长度为2的档案描述符数组,fd[0]是读出端,fd[1]是写入端,函式的返回值为0表示成功,–1表示失败。当函式成功返回,则自动维护了一个从fd[1]到fd[0]的数据通道。
管道创建
半双工管道的创建一般会从程式父进程中先使用pipe函式创建新管道,在调用fork函式创建子进程,在父子进程中维护管道的数据流向,最后,在程式退出时及时关闭管道的两端。
管道操作的基本流程为:先创建一个管道,使用fork创建子进程, 在父子进程中关闭不需要的档案描述符使用管道通信,程式结束。
使用注意事项
当使用半双工管道时,任何关联的进程都必须共享一个相关的祖先进程。因为管道存在于系统核心之中,所以任何不在创建管道的进程的祖先进程之中的进程都将无法定址它。而任命名管道中却不是这样。
虽然可以通过打开两个管道来创建一个双向的管道。但需要在产进程中正确地设定档案描述符。必须在系统调用fork()中调用pipe(),否则子进程不会继承档案描述符。