Linux进程间通信: FIFO(1)

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这两种用途的实例.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值