一、管道(pipe)
1、管道的定义和特点
管道是一种两个进程间进行单向通信的机制。因为管道传递数据的单向性,管道又称为半双工管道。管道的这一特点决定了器使用的局限性。管道是Linux支持的最初Unix IPC形式之一,具有以下特点:
- 1.数据只能由一个进程流向另一个进程(其中一个读管道,一个写管道);如果要进行双工通信,需要建 立两个管道;
- 2.管道只能用于父子进程或者兄弟进程间通信。,也就是说管道只能用于具有亲缘关系的进程间通信。
2、管道的命令
command1 | command2 | command3
二、命名管道(FIFO)
1、命名管道的定义和特点
POSIX标准中的FIFO又名有名管道或命名管道。我们知道前面讲述的POSIX标准中管道是没有名称的,所以它的最大劣势是只能用于具有亲缘关系的进程间的通信。FIFO最大的特性就是每个FIFO都有一个路径名与之相关联,从而允许无亲缘关系的任意两个进程间通过FIFO进行通信。所以,FIFO的两个特性:
- 1.和管道一样,FIFO仅提供半双工的数据通信,即只支持单向的数据流;
- 2.和管道不同的是,FIFO可以支持任意两个进程间的通信。
2、命名管道的使用
下面是FIFO的接口定义:
#include <sys/types.h>
#include <sys/stat.h>
/ /成功则返回0,失败返回-1
int mkfifo(const char *pathname, mode_t mode);
总结
-
- 管道是一个环形队列缓冲区,允许两个进程以生产者消费者模型进程通信。是一个先进先出(FIFO)队列,由一个进程写,而由另一个进程读。
-
- 管道在创建时获得一个固定大小的字节数。当一个进程试图往管道中写时,如果有足够的空间,则写请求立即被执行,否则该进程被阻塞。如果一个进程试图读取的字节数多于当前管道中的字节数,也将被阻塞。
-
- 操作系统强制实行互斥,只能有一个进程可以访问管道。
-
- 只有有血缘关系(父子关系)的进程才可以共享匿名管道,不相关的进程只能共享命名管道。