嵌入式Linux系统编程学习之二十一命名管道(FIFO)


前言

  无名管道只能在有亲缘关系的进程间通信,从而大大限制了管道的使用;有名管道突破了这个限制,通过指定路径名的形式实现不相关进程间的通信。


一、创建、删除FIFO文件

  创建 FIFO 文件与创建普通文件很类似,只是创建后的文件用于 FIFO 。

1. 用函数创建和删除 FIFO 文件

  创建 FIFO 文件的函数原型为:

	#include <sys/types.h>
	#include <sys/stat.h>
	int mkfifo(const char * pathname, mode_t mode);

  参数 pathname 为要创建的 FIFO 文件的全名路径;
  参数 mode 为文件访问权限,如 0666。
  如果创建成功,则返回 0,否则返回 -1。

  删除 FIFO 文件的函数原型为:

	#include <unistd.h>
	int unlink(const char * pathname);

2. 用命令创建和删除 FIFO 文件

  用命令 mkfifo 创建 FIFO 文件,不能重复创建。用命令 unlink 删除 FIFO 文件。创建完毕后,就可以访问 FIFO 文件了。
  一个终端:cat < myfifo
  另一个终端:echo “hello” > myfifo

二、打开、关闭FIFO文件

  对 FIFO 类型的文件的打开、关闭跟普通文件一样,都是使用 open 和 close 函数。如果打开时使用 O_WRONLY 选项,则打开 FIFO 写入端;如果使用 O_RDONLY 选项,则打开 FIFO 的读取端。写入端和读取端都可以被几个进程同时打开。
  管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它当作普通文件一样进行读写操作,使用非常方便。不过值得注意的是,FIFO 是严格遵循先进先出规则的,对管道及 FIFO 的读总是从开始处返回数据,对它们的写则把数据添加到末尾,它们不支持如 lseek() 等文件定位操作,必须按照从前到后的顺序依次读写。
  如果以读取方式打开 FIFO,并且还没有其他进程以写入方式打开 FIFO,open 函数将被阻塞;同样,如果以写入方式打开 FIFO,并且还没有其他进程以读取方式打开 FIFO,open 函数也将被阻塞。但是,如果 open 函数中包含 O_NONBLOCK 选项,则在上述两种情况下调用 open 函数都不被阻塞。
  与 PIPE 相同,关闭 FIFO 时,如果先关闭读取端,将导致继续往下 FIFO 中写数据的进程接收 SIG_PIPE 信号。

三、读写FIFO

  可以采用与普通文件相同的读写方式读写 FIFO。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值