转载于和感谢:linux有名管道fifo,进程间通信

命名管道(FIFO)不同于无名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,这样,即使与 FIFO 的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过 FIFO 相互通信,因此,通过 FIFO 不相关的进程也能交换数据。

命名管道(FIFO)和无名管道(pipe)有一些特点是相同的,不一样的地方在于:

1、FIFO 在文件系统中作为一个特殊的文件而存在,但 FIFO 中的内容却存放在内存中。

2、当使用 FIFO 的进程退出后,FIFO 文件将继续保存在文件系统中以便以后使用。

3、FIFO 有名字,不相关的进程可以通过打开命名管道进行通信。

int mkfifo(const char *pathname, mode_t mode);用于创建一个管道

int open(const char *pathname, int flags);用于打开一个管道

打开FIFO文件和普通文件的区别有2点:

第一个是不能以O_RDWR模式打开FIFO文件进行读写操作。这样做的行为是未定义的。

因为我们通常使用FIFO只是为了单向传递数据,所以没有必要使用这个模式。

如果确实需要在程序之间双向传递数据,最好使用一对FIFO或管道,一个方向使用一个。或者采用先关闭在重新打开FIFO的方法来明确改变数据流的方向。

第二是对标志位的O_NONBLOCK选项的用法。

使用这个选项不仅改变open调用的处理方式,还会改变对这次open调用返回的文件描述符进行的读写请求的处理方式。

O_RDONLY、O_WRONLY和O_NONBLOCK标志共有四种合法的组合方式:

flags=O_RDONLY:open将会调用阻塞,除非有另外一个进程以写的方式打开同一个FIFO,否则一直等待。
flags=O_WRONLY:open将会调用阻塞,除非有另外一个进程以读的方式打开同一个FIFO,否则一直等待。
flags=O_RDONLY|O_NONBLOCK:如果此时没有其他进程以写的方式打开FIFO,此时open也会成功返回,此时FIFO被读打开,而不会返回错误。
flags=O_WRONLY|O_NONBLOCK:立即返回,如果此时没有其他进程以读的方式打开,open会失败打开,此时FIFO没有被打开,返回-1。
open函数调用中的参数标志O_NONBLOCK会影响FIFO的读写操作。

规则如下:

对一个空的阻塞的FIFO的read调用将等待,直到有数据可以读的时候才继续执行/
对一个空的非阻塞的FIFO的read调用立即返回0字节。
对一个完全阻塞的FIFO的write调用将等待,直到数据可以被写入时才开始执行。
系统规定:如果写入的数据长度小于等于PIPE_BUF字节,那么或者写入全部字节,要么一个字节都不写入。
注意这个限制的作用:
当只使用一个FIF并允许多个不同的程序向一个FIFO读进程发送请求的时候,为了保证来自不同程序的数据块 不相互交错,即每个操作都原子化,这个限制就很重要了。如果能够包子所有的写请求是发往一个阻塞的FIFO的,并且每个写请求的数据长父小于等于PIPE_BUF字节,系统就可以确保数据绝不会交错在一起。通常将每次通过FIFO传递的数据长度限制为PIPE_BUF是一个好办法。

在非阻塞的write调用情况下,如果FIFO 不能接收所有写入的数据,将按照下面的规则进行:
请求写入的数据的长度小于PIPE_BUF字节,调用失败,数据不能被写入。
请求写入的数据的长度大于PIPE_BUF字节,将写入部分数据,返回实际写入的字节数,返回值也可能是0。
其中。PIPE_BUF是FIFO的长度,它在头文件limits.h中被定义。在linux或其他类UNIX系统中,它的值通常是4096字节。

开发日记-20190823 linux有名管道fifo,进程间通信相关推荐

  1. linux 有名管道FIFO

    linux文件主要有4种:普通文件.目录文件.设备文件(字符设备文件/块设备文件).管道文件 管道文件(p表示管道文件) [redhat@localhost tmp]$ mkfifo fifo [re ...

  2. linux有名管道 mkfifo,有名管道mkfifo

    int mkfifo(const char *pathname, mode_t mode); int mknod(const char *pathname, mode_t mode, dev_t de ...

  3. linux有名管道 复用,关于LINUX有名管道的多路复用有关问题

    关于LINUX有名管道的多路复用有关问题 关于LINUX有名管道的多路复用有关问题 日期:2014-05-16 浏览次数:20351 次 关于LINUX有名管道的多路复用问题 我的意思是说,用有名管道 ...

  4. 有名管道FIFO,进行双进程的“双向通信”

    更多资料请点击:我的目录 本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢. 本篇记录应用有名管道FIFO,进行双进程的"双向通信" ...

  5. 【编撰】linux IPC 002 - 匿名管道PIPE和有名管道FIFO的概念和实例,以及应用比较

    前言:上一节提到IPC的概述,本一节,原文作者比较详细的讨论了,管道的概念和实例和使用场景: 原文作者:郑彦兴 (mlinux@163.com)国防科大计算机学院 http://www.ibm.com ...

  6. 【Linux系统编程学习】匿名管道pipe与有名管道fifo

    此为牛客Linux C++和黑马Linux系统编程课程笔记. 0. 关于进程通信 Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间.任何一个进程的全局变量在另一个进程中都看不到 ...

  7. linux 有名管道(FIFO)

    无名管道应用的一个重大限制是它没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道(named pipe或FIFO)提出后,该限制得到了克服.FIFO不同于管道之处在于它提供一个路径名与之关联 ...

  8. linux系统调用创建无名管道,linux 无名管道pipe和有名管道FIFO

    1.管道(pipe) 管道是进程间通信的主要手段之一.一个管道实际上就是个只存在于内存中的文件,对这个文件的操作要通过两个已经打开文件进行,它们分别代表管道的两端.管道是一种特殊的文件,它不属于某一种 ...

  9. Linux内核中无名管道pipe和有名管道fifo的分析

    1.管道(pipe) 管道是进程间通信的主要手段之一.一个管道实际上就是个只存在于内存中的文件,对这个文件的操作要通过两个已经打开文件进行,它们分别代表管道的两端.管道是一种特殊的文件,它不属于某一种 ...

最新文章

  1. Python爬取近十万条程序员招聘数据,告诉你哪类人才和技能最受热捧! | 原力计划...
  2. Bootstrap排版中地址与引用详解
  3. XT711(大陆行货)刷机与优化指南
  4. 【hdoj】3007 Buried memory 【计算几何--最小圆覆盖】
  5. Springboot集成BeanValidation扩展一:错误提示信息加公共模板
  6. 高速率AVS整数变换的汇编实现与优化
  7. 2021数字化就业新职业新岗位研究报告
  8. 解决:无法添加符号: DSO missing from command line
  9. paip.基于navicate mysql的自动化报表工具总结
  10. Linux【环境部署 02】yum源镜像下载+挂载镜像+本地yum源配置+局域网yum源服务搭建+局域网yum源使用(一篇学会离线yum源配置)
  11. 神仙打架!清华公布2020特奖候选人名单,有人三篇顶会一作!还有人...
  12. C语言中字符‘0‘和‘\0‘,及整数0的区别
  13. 京东2022双11预售期,商家该做些什么?
  14. C#大文件上传支持切片上传
  15. 哪些蓝牙耳机适合打游戏?适合打游戏的低延迟蓝牙耳机排行
  16. sql的update语句 批量更新某字段
  17. DP DD VTL 备份 NBU
  18. UCGUI使用外部字库芯片显示汉字
  19. mysql innodbrowlocktime_MySQL innodb行锁测试
  20. vba 判断文本框内容是否为空_Excel/VBA编程用户交互函数(二)——InputBox()函数和inputbox方法...

热门文章

  1. Spring入门详细教程(四)
  2. prometheus+grafana+pushgateway+node-exporter+consul搭建监控系统
  3. ajax post请求怎么传参_ajax用post方法传递参数
  4. 怎样将英文html文件转换成中文乱码,解决html导出pdf中文乱码问题的正确姿势
  5. mysql为查询结果字段赋默认值
  6. 关于修改session的生存时间以及回收机制
  7. 一个星期+4轮面试终拿下offer,进阶学习
  8. Android开发热门前沿知识,成功定级腾讯T3-2
  9. python【蓝桥杯vip练习题库】ALGO-50 数组查找及替换
  10. 全卷积神经网路【U-net项目实战】U-net网络结构为什么在医学影像分割上表现不错