FIFO(命名管道)
FIFO常被称为命名管道,以区分管道(pipe)。管道(pipe)只能用于“有血缘关系”的进程间。但通过FIFO,不相关的进程也能交换数据。FIFO是Linux基础文件类型中的一种(p,管道文件)。但FIFO文件在磁盘上没有数据块,仅仅用来标识内核中一条通道。各进程可以打开这个文件进行read/write,实际上是在读写内核通道,这样就实现了进程间通信。另外,使用统一fifo文件,可以有多个读端和多个写端。
FIFO文件(p)的创建方式:1. 命令:mkfifo 管道名; 2. 库函数:int mkfifo(const char *pathname, mode_t mode); 成功:0; 失败:-1 当mkfifo的第一个参数是一个已经存在的路径名时,则会出错返回-1,因此一般使用该函数时要判断返回值。 第二个参数为8进制数,一般设置为0666即可,即管道文件只需要读写权限,不需要执行权限。 包含库文件:#include <sys/types.h> #include <sys/stat.h>
一旦创建了一个FIFO,就可以使用open打开它,常见的文件I/O函数都可用于fifo。如:close、read、write、unlink等。unlink可以删除一个管道文件。
注意:当进程对命名管道的使用结束后,命名管道依然存在于文件系统中,除非对其进行删除操作。命名管道的数据读取后也会消失(不能反复读取),即且严格遵循先进先出的规则。因此,每次命名管道文件使用完后,其大小为0字节,不会产生中间临时文件。
//使用函数创建命名管道(命令行参数指定文件名字)
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>int main(int argc , char *argv[ ])
{if(argc < 2){printf("./a.out fifoname\n");exit(1);}int ret;mode_t mode=0666;ret = mkfifo(argv[1],mode);if(ret == -1){perror("mkfifo");exit(1);}exit(0);
}
//向管道文件中读写数据,实现进程间通信
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>void sys_err(char *str)
{perror(str);exit(1);
}int main(int argc, char *argv[])
{int fd, i;char buf[4096];if (argc < 2) {printf("Enter like this: ./a.out fifoname\n");return -1;}fd = open(argv[1], O_WRONLY);if (fd < 0)sys_err("open");i = 0;while (1) {sprintf(buf, "hello itcast %d\n", i++);write(fd, buf, strlen(buf));sleep(1);}close(fd); return 0;
}#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>void sys_err(char *str)
{perror(str);exit(1);
}int main(int argc, char *argv[])
{int fd, len;char buf[4096];if (argc < 2) {printf("./a.out fifoname\n");return -1;}fd = open(argv[1], O_RDONLY);if (fd < 0)sys_err("open");while (1) {len = read(fd, buf, sizeof(buf));write(STDOUT_FILENO, buf, len);sleep(3); //多个读端时应增加睡眠秒数,放大效果}close(fd);return 0;
}
FIFO(命名管道)相关推荐
- linux pipe 命名管道,linux 进程学习笔记-named pipe (FIFO)命名管道
与"无名管道"不同的是,FIFO拥有一个名称来标志它,所谓的名称实际上就是一个路径,比如"/tmp/my_fifo",其对应到磁盘上的一个管道文件,如果我们用f ...
- python FIFO命名管道
fifo(first in first out) 也称named pipe(命名管道),单向数据流(半双工管道) 本质: 1.硬盘建立一个文件,对文件进行读写,实际数据没有流入硬盘 优点: 1.可以非 ...
- Linux中的pipe(管道)与named pipe(FIFO 命名管道)
catalogue 1. pipe匿名管道 2. named pipe(FIFO)有名管道 1. pipe匿名管道 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入 ...
- linux 进程间通信 命名管道FIFO的原理与使用
参考文章1:管道 pipe是什么?(进程通信的一种方式)(可以先大致了解管道) 参考文章2:FIFO(命名管道) FIFO常被称为命名管道,以区分管道(pipe).管道(pipe)只能用于" ...
- linux命名管道进程间通信,《Linux 进程间通信》命名管道:FIFO
命名管道的主要用途:不相关的进程之间交换数据. 命令行上创建命名管道: $ mkfifo filename 程序中创建命名管道: #include #include int mkfifo(const ...
- linux 命名管道通信速度,《Linux 进程间通信》命名管道:FIFO
命名管道的主要用途:不相关的进程之间交换数据. 命令行上创建命名管道: $ mkfifo filename 程序中创建命名管道: #include #include int mkfifo(const ...
- java mkfifo_命名管道FIFO和mkfifo函数
进程间通信必须通过内核提供的通道,而且必须有一种办法在进程中标识内核提供的某个通道,前面讲过的匿名管道是用打开的文件描述符来标识的.如果要互相通信的几个进程没有从公共祖先那里继承文件描述符,它们怎么通 ...
- linux c之命名管道简单使用
1.介绍FIFO(命名管道) 管道有局限性,只能在具有亲缘关系的进程间通信,但是命名管道克服了这个问题,可以实现无亲缘关系的进程之间的通信 API介绍: /* FIFO 命名管道 */ /* * 函数 ...
- linux_FIFO命名管道-mkfifo函数-进程通信
接上一篇:linux_管道学习-pipe函数-管道的读写-fpathconf函数 本次来分享FIFO命名管道,一些常识,开始上菜: 1.FIFO-mkfifo函数 FIFO常被称为命名管道,以区分 ...
- java 命名管道_linux 命名管道实例详解
linux进程间通信--命名管道 FIFO(命名管道)不同于匿名管道之处在于它提供⼀个路径名与之关联,以FIFO的⽂件形式存储于⽂件系统中.命名管道是⼀个设备⽂件,因此,即使进程与创建FIFO的进程不 ...
最新文章
- 小猿圈自学web前端之CSS3动画练习案例:用CSS3做个钟表
- 什么是数据中心,它们是如何变化的?
- python的运行环境_python-运行环境配置-1
- vue 引入json地图_VUE中通过Echarts引入地图
- 锤子不死!还有新手机,但要等很久...
- 【已验证】帝国cms 里 栏目列表模板获取同级栏目
- linux定时备份前一天,linux定时备份
- 路长全讲座免费在线学习 免费下载
- halcon中的面向对象,数据保存(续)
- 三菱FX3U生产方案 FX3U源代码+PCB文件全套生产方案 基于STM32F10的FX3U源码, 可直接使用GXworks2软件
- 新潮科技:人工智能歌词创作软件app,在线ai作词押韵写歌词,可以自己写歌词的软件
- python体测成绩数据分析_Python+Excel数据分析实战:军事体能考核成绩评定(二)基本框架和年龄计算...
- React-Pdf使用过程心得
- 2020年,抖音赚钱全攻略,做抖音,看这就够了!
- 关爱中老年健康,践行康养华夏,中老年春晚《康养华夏》栏目启动大会在广州盛大举行
- 【微机原理与接口技术】学习笔记5 I/O接口和并行接口芯片8255A
- html表格table的表头排序,js代码fastunit使用案例
- 公网IP与内网穿透的使用场景和区别
- Android 启动后台运行程序(Service)
- kinect_试衣间(1)
热门文章
- 【转】Java:String、StringBuffer和StringBuilder的区别
- DNN SEO专题 (收集)
- 剑灵系统推荐加点_剑灵重制修炼系统 无定式加点打造自我风格
- mock模拟接口测试 vue_在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟...
- debian dhcp服务启动不了_DHCP服务器配置
- saml java实现_java-saml
- mysql中预定义常量_PHP预定义常量
- python随机数生成的方法_python生成随机数的方法
- C++内联(inline)函数
- 二叉树中的最大路径和