命名管道

命名管道(named pipe)又被称为先进先出队列(FIFO),是一种特殊的管道,存在于文件系统中。命名管道与管道非常类似,但是又有自身的显著特征:

  1. 命名管道可以用于任何两个进程间的通信,而不限于同源的两个进程。
  2. 命名管道作为一种特殊的文件存放在文件系统中,而不是像管道那样存放在内核中。当进程对命名管道的使用结束后,命名管道依然存在于文件系统中,除非对其进行删除操作,否则该命名管道不会自行消失。

和管道一样,命名管道也只能用于数据的单向传输,如果要用命名管道实现两个进程间数据的双向传输,建议使用两个单向的命名管道。

Linux命令行创建使用命名管道

创建命名管道

mkfifo +FIFO_filename

使用命名管道

  1. 在一个终端对管道写入


另一终端读数据,读完数据,管道为空

C语言操作命名管道

创建命名管道的系统函数有两个: mknod和mkfifo。两个函数均定义在头文件sys/stat.h,函数原型如下:

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *path,mode_t mode);//命名管道专用
int mknod(const char *path,mode_t mod,dev_t dev);//还可以用来创建设备文件

参数中,path为创建的命名管道文件存放位置;mode为权限;dev为设备号

使用的基本步骤:

写端创建管道文件;
写端获取管道文件fd,写入数据,写完close文件描述符;
读端获取管道文件fd,读入数据,读完或写端关闭close文件描述符;

测试demo

写端

#include<stdio.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#define PATH "./fifo.tmp"
int main()
{char s[] = "hello i am writer\n";if(mkfifo(PATH,0666) < 0){perror("mkfifo fail:");return -1;}int fd = open(PATH,O_WRONLY);write(fd,s,sizeof(s));close(fd);return 0;
}

运行

读端

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>
#define PATH "./fifo.tmp"
int main()
{char s[1024];int fd = open(PATH,O_RDONLY);int ret = read(fd,s,sizeof(s));if(ret < 0){perror("read fail:");return -1;}if(ret == 0){perror("read no data:");return -2;}printf("reader get data:%s\n",s);return 0;
}

Linux--命名管道(FIFO)相关推荐

  1. Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)

    整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...

  2. linux进程间通信:命名管道FIFO

    文章目录 FIFO 通信特点 系统调用接口 应用 拥有亲缘关系之间的进程通信 非亲缘关系进程之间的通信 总结 FIFO 通信特点 FIFO文件有文件名 可以像普通文件一样存储在文件系统之中 可以像普通 ...

  3. 开发日记-20190823 linux有名管道fifo,进程间通信

    转载于和感谢:linux有名管道fifo,进程间通信 命名管道(FIFO)不同于无名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,这样,即使与 FIFO 的创建进程 ...

  4. linux命名管道通信方式图例,linux IPC 命名管道

    在前面一篇文章中[Linux进程间通信] - 匿名管道中,我们介绍了Linux/Unix系统中最古老的一种进程间通信方式 – 匿名管道.此外,我们也讲解了匿名管道的几个局限性,特别是匿名管道只能用于父 ...

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

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

  6. 【Linux】进程间通信-命名管道FIFO

    命名管道概述 如果我们要在不相关的进程间交换数据,那么使用FIFO文件将会十分方便. FIFO文件通常也称为命名管道(named pipe).命名管道是一种特殊类型的文件,它在文件系统中以文件名的形式 ...

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

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

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

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

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

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

  10. linux系统编程之管道(三):命名管道FIFO和mkfifo函数

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

最新文章

  1. Java面试之Java基础下册(含答案)
  2. 标杆课程采访补充问题
  3. java有参和无参的用处_Java对比有参数和无参数
  4. LInux查看CPU状态
  5. tomcat jar包编译后变成文件夹_tomcat学习|tomcat中的类加载器
  6. WPF实现环(圆)形进度条
  7. lisp对excel其他行列写入_【极简Python 自动化办公】Python写入Excel表格
  8. Bootstrap3 源代码样式
  9. sql管理器指定服务器名字,如何修改sql server 服务管理器 服务器名称
  10. linux系统编程综合练习-实现一个小型的shell程序(四)
  11. 第一个java程序的错误_我是一名java初学者,执行第一个java程序welcome.java出现了以下错误,这是为什么?...
  12. PAT (Basic Level) Practice1011 A+B 和 C
  13. 【信号分解】基于遗传算法优化变分模态分解VMD实现信号去噪附matlab代码
  14. weblogic安装与部署项目
  15. 《微信公众平台入门到精通》Vol.1
  16. 关于短除法求两个数的最小公倍数的公式的解释
  17. html banner广告代码,jquery实现的Banner广告收缩效果代码
  18. <<视觉问答>>2021:How Transferable are Reasoning Patterns in VQA?
  19. oracle 索引快速全扫描,使用目录快速全扫描(Index FFS)避免全表扫描的若干场景
  20. 游戏制作策划人员指南

热门文章

  1. Web3还没实现,Web5乍然惊现!
  2. 哥们别逗 了,写个脚本那真不叫运维自动化!
  3. html之设置页面ico图标ie浏览器,如何修改网页小图标,浏览器页面上的图标(favicon.ico)...
  4. 适用于数据中心和边缘应用的液冷技术
  5. bootloader技术内幕
  6. 小学是否有计算机专业,小学计算机教学计划
  7. 小狗AI自动建站V7 sitemap(网站地图)使用说明
  8. Pr混剪视频制作教程[纯萌新]
  9. yyyy-mm-dd与yyyy-MM-dd的区别
  10. django基于python的平南盛世名城小区疫情防控系统--python-计算机毕业设计