关于FIFO
FIFO(First In, First Out)是一种数据结构,用于管理数据的存储和访问顺序。它基于先进先出的原则,即最先进入的数据最先被处理或访问,在有名管道中常用。
本质
一段特殊的内存,也可以说是一种特殊文件,其内容在内存中,文件系统可以找到文件名。
特点
- 半双工,数据在同一时刻只能在一个方向上流动(可以认为是一根普通水管,在一个时刻内,管内的水流只能向一个方向流动);
- 写入FIFO中的数据遵循先入先出的规则,类似队列;
- FIFO传送的数据无格式,这就需要读出方与写入方提前确认好数据格式(例如数据类型、多少个字节算一个消息段);
- FIFO在文件中作为一个特殊文件(仿文件)而存在,但FIFO的内容存放在内存中;
- 管道中存在一段缓冲区(可以认为这一段水管的长度),其长度由系统决定;
- 从FIFO读取数据是一次性的,一旦数据被读取,就从FIFO中被抛弃;
- 当使用FIFO的进程退出后,FIFO文件将继续保存在文件系统中以便以后使用(建议在一个文件夹中建立的管道不要重名);
- FIFO有名字,不相关进程也可通过管道进行通信(跟无名管道最大的区别)。
函数原型
//FIFO文件的创建
#include<sys/types.h>
#include<sys/stst.h>
int mkfifo(const char*pathname,mode_t mode);
参数:
pathname:FIFO的路径名+文件名
mode:mode_t类型的权限描述符
返回值:
成功:返回 0
失败:如果文件已存在,则会出错且返回 -1
使用范例
send.c
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{
//创建管道fifo设置权限777(可读可写可执行)
int ret=mkfifo("./fifo",0777);
//如果创建失败打印错误
if(ret == -1)
perror("mkfifo");
//以可读可写的方式打开管道
int fd = open("./fifo",O_RDWR);
//向管道写入内容
write(fd,"hello",sizeof("hello"));
close(fd);
return 0;
}
rcv.c
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{
//创建管道fifo设置权限777(可读可写可执行)
int ret=mkfifo("./fifo",0777);
//如果创建失败打印错误
if(ret == -1)
perror("mkfifo");
//以可读可写的方式打开管道
int fd = open("./fifo",O_RDWR);
//从管道读出内容
char buf[64] = "";
read(fd,buf,sizeof(buf));
printf("buf = %s\n",buf);
close(fd);
return 0;
}
运行结果