IPC

前面总结了匿名管道,现在来看命名管道:由于匿名管道的一个限制就是:只能是有血缘关系的进程间才可以通信,比如:有两个同祖先的子进程,父子进程等;为了突破这一个限制,想让没有任何关系的两个进程间也能正常通信,所以就就有了命名管道这样的一个通信机制,一起来看看:

命名管道

一、原理:

管道的一个不足之处是没有名字,因此,只能用于具有亲缘关系的进程间通信,在命名管道(named pip或FIFO)提出后,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存储于文件系统中。命名管道是一个设备文件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通信。

值得注意的是,FIFO(first input first output)总是按照先进先出的原则工作,第一个被写入的数据将首先从管道中读出。

二、命名管道的创建与读写

Linux下有两种方式创建命名管道。一是在Shell下交互地建立一个命名管道,二是在程序中使用系统函数建立命名管道。Shell方式下可使用mknod或mkfifo命令,下面命令使用 mknod创建了一个命名管道:

mknod namedpipe

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

函数原型如下:

#include <sys/types.h>
#include <sys/stat.h>
int mknod(const char *path,mode_t mod,dev_t dev);
int mkfifo(const char *path,mode_t mode);

函数mknod参数中path为创建的命名管道的全路径名:mod为创建的命名管道的模式,指明其存取权限;dev为设备值,该值取决于文件创建的种类,它只在创建设备文件时才会用到。这两个函数调用成功都返回0,失败都返回-1。

三、实例

用mkfifo创建命名管道:

其中_PATH_是文件路径名的宏定义:如下:

“S_IFIFO|0666”指明创建一个命名管道且存取权限为0666,即创建者、与创建者同组的用户、其他用户对该命名管道的访问权限都是可读可写。

命名管道创建后就可以使用了,命名管道和管道的使用方法基本是相同的。只是使用命名管道时,必须用open()将其打开。因为命名管道是一个存在于硬盘上的文件,而管道是存在于内存中的特殊文件。

需要注意的是,调用open()打开命名管道的进程可能会被阻塞。但如果同时用读写方式(O_RDWR)打开,则一定不会导致阻塞;如果以只读方式(O_RDONLY)打开,则调用open()函数的进程将会被阻塞直到有写方打开管道;同样以写方式(O_WRONLY)打开也会阻塞直到有读方式打开管道。

四:结束

文件系统中的路径名是全局的,各进程都可以访问,因此可以用文件系统中的路径名来标识一个IPC通道。 命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和之前所讲的没有名字的管道(匿名管道)类似。

由于Linux中所有的事物都可被视为文件,所以对命名管道的使用也就变得与文件操作非常的统一,也使它的使用非常方便,同时我们也可以像平常的文件名一样在命令中使用。

五、命名管道的安全问题

前面的例子两个进程之间的通信问题,也就是说,一个进程向FIFO文件写数据,而另一个进程则在FIFO文件中读取数据。试想这样一个问题,只使用一个FIFO文件,如果有多个进程同时向同一个FIFO文件写数据,而只有一个读FIFO进程在同一个FIFO文件中读取数据时,会发生怎么样的情况呢,会发生数据块的相互交错是很正常的?而且个人认为多个不同进程向一个FIFO读进程发送数据是很普通的情况。
   为了解决这一问题,就是让写操作的原子化。怎样才能使写操作原子化呢?答案很简单,系统规定:在一个以O_WRONLY(即阻塞方式)打开的FIFO中, 如果写入的数据长度小于等待PIPE_BUF,那么或者写入全部字节,或者一个字节都不写入。如果所有的写请求都是发往一个阻塞的FIFO的,并且每个写记请求的数据长度小于等于PIPE_BUF字节,系统就可以确保数据决不会交错在一起。

命名管道总结到此,其余通信机制,见下一篇博文。

赐教!

转载于:https://www.cnblogs.com/li-ning/p/9489954.html

Linux进程间通信--命名管道相关推荐

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

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

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

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

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

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

  4. linux 命名管道 c语言 不同进程,进程间通信 - 命名管道实现

    命名管道概述 命名管道是通过网络来完成进程之间的通信的,命名管道依赖于底层网络接口, 其中包括有 DNS 服务,TCP/IP 协议等等机制,但是其屏蔽了底层的网络协议细节, 对于匿名管道而言,其只能实 ...

  5. c语言程序实现进程的管道通信,C 进程间通信--命名管道通信代码实现及其原理图示...

    在将这个题目之前大家需要了解几个概念: 进程: 我们可以先看进程的定义:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础: ...

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

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

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

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

  8. 进程间通信--命名管道

    几个术语 二义性:当我们往一个管道里面写端写数据的时候,比如写一个hello的时候,当我们写到he的时候,读端就已经开始读取数据了,所以这是不对的,这就是二义性 临界资源:多个流可以访问的一个共同的存 ...

  9. 进程间通信 - 命名管道实现

    引子 好,到这里呢,就需要介绍实现进程间通信的第四种方式了, 也就是通过命名管道来实现,前面介绍的那三种方式呢,都是有缺陷或者说局限性太强, 而这里介绍的命名管道相对来说,在这方面就做得好很多了, 比 ...

  10. Linux 进程间通信:管道、共享内存、消息队列、信号量

    进程间通信 管道 共享内存 消息队列 信号量 进程间通信 https://blog.csdn.net/qq_35423154/article/details/105294963 在之前的一篇博客中讲过 ...

最新文章

  1. 关于学习Python的一点学习总结(18->序列解包)
  2. 【拓扑排序】【bitset】Gym - 101128A - Promotions
  3. 远程桌面时提示凭证不工作问题的终极解决办法
  4. 2038问题 linux_Linux 文件系统类型导览
  5. 从外卖员到程序员,自学3年终于转行成功,三面“拿下”拼多多,把经历分享给你们!
  6. wxPython 笔记(8)设定窗体的样式
  7. 捆网包裹行业调研报告 - 市场现状分析与发展前景预测
  8. ubuntu从命令打开终端
  9. 【神经网络与深度学习】公开的海量数据集
  10. B站游戏排行榜(No.1竟是‘原神‘)—— B站动态页面爬取
  11. android 无法播放mp3文件夹,Android Assets文件夹中的Mp3音频无法通过签名...
  12. netapp存储 api接口
  13. 【C语言】字符串数组按字典升序
  14. 微服务的优缺点_支付宝上的好医保长期医疗险这款保险到底怎么样?保障全面吗?有哪些优缺点?值得买吗?...
  15. Golang——time.Ticker定时器
  16. 【CSS+HTML】实现鼠标失去鼠标焦点动画
  17. 科学计算机算余切,科学计算机在线算(科学计算器如何算正态分布)
  18. Java中的委托和继承(Delegation and Inheritance)
  19. flask 使用cnd导入bootstrap5
  20. 小甲鱼python笔记_[Python]之前初学python,看小甲鱼视频的笔记(未整理)

热门文章

  1. STL基本操作及其运用
  2. 直线/折线/圆/三角形划分平面直线切割球问题大总结(最多能划分多少区域)
  3. 金融银行业机器学习—机遇、风险、案例
  4. pandas 数据分析 相关性_Pandas库学习笔记2-Pandas数据特征分析
  5. python正则表达式提取c语言中的函数,Python正则表达式匹配C语言函数
  6. 93. 复原IP地址
  7. sqlalchemy连接和关闭数据库
  8. 计算机基础及应用期末,《计算机应用基础》期末复习综合练习题及答案
  9. python文件的路径_python3 文件及文件夹路径相关
  10. 机器学习课程 Neural Netword for Machine Learning笔记