FIFO是一种常见的说法: First In First Out, 先进先出, 是数据结构中队列(queue)的数据处理形式.
而我们这里要说的FIFO又叫做命名管道, 是一种进程间通信的方式.
1. 概念:
管道的限制是只能由拥有共同祖先的进程间使用, 而FIFO不需要, 它可以在不相关的进程间交换数据.
2. 创建FIFO:
在Linux下, FIFO是一种文件类型, 创建FIFO类似于创建一个文件. 确实, FIFO的路径名存在于文件系统中. 创建FIFO的函数:
头文件: <sys/stat.h>
原型: int mkfifo(const char *pathname, mode_t mode);
返回值: 成功则返回0, 出错则返回-1.
参数:
pathname: 路径名.
mode: 与open函数中的mode相同.
说明: 新创建的FIFO, 用户和组的所有权规则也与新创建的文件相同. (见APUE 4.6节)
用mkfifo创建的FIFO, 可以用open系统调用打开, 其他一般的文件I/O函数也可以用于FIFO(如read, write, close等)
3. 打开FIFO:
由于FIFO在Linux类似于文件一样操作, 因此这里只说明它的特殊之处, FIFO的O_NONBLOCK打开.
当FIFO以O_NONBLOCK(非阻塞方式)打开时, 产生下列影响:
在一般情况下(没有指定O_NONBLOCK), 只读open要阻塞到某个其他进程为写而打开此FIFO.
类似地, 只写open要阻塞到某个其他进程为读而打开此FIFO.
如果指定了O_NONBLOCK, 则只读open立即返回.
如果没有进程已经为读而打开一个FIFO, 那么只写open将出错返回-1, 其errno是ENXIO.
4. FIFO的用途:
FIFO由shell命令使用以便将数据从一条管道线传送到另一条,为此无需创建中间临时文件.
FIFO用于C/S结构的应用程序中, 以在C端进程和S端进程之间传送数据.
这是一篇纯概念文章, 后面一篇文章中将介绍FIFO这两种用途的实例.