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(命名管道)相关推荐

  1. linux pipe 命名管道,linux 进程学习笔记-named pipe (FIFO)命名管道

    与"无名管道"不同的是,FIFO拥有一个名称来标志它,所谓的名称实际上就是一个路径,比如"/tmp/my_fifo",其对应到磁盘上的一个管道文件,如果我们用f ...

  2. python FIFO命名管道

    fifo(first in first out) 也称named pipe(命名管道),单向数据流(半双工管道) 本质: 1.硬盘建立一个文件,对文件进行读写,实际数据没有流入硬盘 优点: 1.可以非 ...

  3. Linux中的pipe(管道)与named pipe(FIFO 命名管道)

    catalogue 1. pipe匿名管道 2. named pipe(FIFO)有名管道 1. pipe匿名管道 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入 ...

  4. linux 进程间通信 命名管道FIFO的原理与使用

    参考文章1:管道 pipe是什么?(进程通信的一种方式)(可以先大致了解管道) 参考文章2:FIFO(命名管道) FIFO常被称为命名管道,以区分管道(pipe).管道(pipe)只能用于" ...

  5. linux命名管道进程间通信,《Linux 进程间通信》命名管道:FIFO

    命名管道的主要用途:不相关的进程之间交换数据. 命令行上创建命名管道: $ mkfifo filename 程序中创建命名管道: #include #include int mkfifo(const ...

  6. linux 命名管道通信速度,《Linux 进程间通信》命名管道:FIFO

    命名管道的主要用途:不相关的进程之间交换数据. 命令行上创建命名管道: $ mkfifo filename 程序中创建命名管道: #include #include int mkfifo(const ...

  7. java mkfifo_命名管道FIFO和mkfifo函数

    进程间通信必须通过内核提供的通道,而且必须有一种办法在进程中标识内核提供的某个通道,前面讲过的匿名管道是用打开的文件描述符来标识的.如果要互相通信的几个进程没有从公共祖先那里继承文件描述符,它们怎么通 ...

  8. linux c之命名管道简单使用

    1.介绍FIFO(命名管道) 管道有局限性,只能在具有亲缘关系的进程间通信,但是命名管道克服了这个问题,可以实现无亲缘关系的进程之间的通信 API介绍: /* FIFO 命名管道 */ /* * 函数 ...

  9. linux_FIFO命名管道-mkfifo函数-进程通信

    接上一篇:linux_管道学习-pipe函数-管道的读写-fpathconf函数 本次来分享FIFO命名管道,一些常识,开始上菜: 1.FIFO-mkfifo函数   FIFO常被称为命名管道,以区分 ...

  10. java 命名管道_linux 命名管道实例详解

    linux进程间通信--命名管道 FIFO(命名管道)不同于匿名管道之处在于它提供⼀个路径名与之关联,以FIFO的⽂件形式存储于⽂件系统中.命名管道是⼀个设备⽂件,因此,即使进程与创建FIFO的进程不 ...

最新文章

  1. 小猿圈自学web前端之CSS3动画练习案例:用CSS3做个钟表
  2. 什么是数据中心,它们是如何变化的?
  3. python的运行环境_python-运行环境配置-1
  4. vue 引入json地图_VUE中通过Echarts引入地图
  5. 锤子不死!还有新手机,但要等很久...
  6. 【已验证】帝国cms 里 栏目列表模板获取同级栏目
  7. linux定时备份前一天,linux定时备份
  8. 路长全讲座免费在线学习 免费下载
  9. halcon中的面向对象,数据保存(续)
  10. 三菱FX3U生产方案 FX3U源代码+PCB文件全套生产方案 基于STM32F10的FX3U源码, 可直接使用GXworks2软件
  11. 新潮科技:人工智能歌词创作软件app,在线ai作词押韵写歌词,可以自己写歌词的软件
  12. python体测成绩数据分析_Python+Excel数据分析实战:军事体能考核成绩评定(二)基本框架和年龄计算...
  13. React-Pdf使用过程心得
  14. 2020年,抖音赚钱全攻略,做抖音,看这就够了!
  15. 关爱中老年健康,践行康养华夏,中老年春晚《康养华夏》栏目启动大会在广州盛大举行
  16. 【微机原理与接口技术】学习笔记5 I/O接口和并行接口芯片8255A
  17. html表格table的表头排序,js代码fastunit使用案例
  18. 公网IP与内网穿透的使用场景和区别
  19. Android 启动后台运行程序(Service)
  20. kinect_试衣间(1)

热门文章

  1. 【转】Java:String、StringBuffer和StringBuilder的区别
  2. DNN SEO专题 (收集)
  3. 剑灵系统推荐加点_剑灵重制修炼系统 无定式加点打造自我风格
  4. mock模拟接口测试 vue_在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟...
  5. debian dhcp服务启动不了_DHCP服务器配置
  6. saml java实现_java-saml
  7. mysql中预定义常量_PHP预定义常量
  8. python随机数生成的方法_python生成随机数的方法
  9. C++内联(inline)函数
  10. 二叉树中的最大路径和