进程间通信--管道、命名管道、FIFO

无名管道、有名管道(FIFO)

比较类似进程间的生产者、消费者模型。一个进程向管道中写入数据,另一个进程从管道中读出数据。pipe为无名管道,提供的是一组半双工通信方式。pipe会创建两个文件对象,一个索引节点。pipe在内核中会有一个缓存,缓存大小可能若干个页大小。调用write像管道里写数据时,系统会将数据存于缓存,另一个线程通过read从缓存中取出数据。管道的大小就是缓存中尚未被读取的数据大小。
管道在内核中是作为VFS的对象来实现的,Linux 内核中,将pipe在VFS中组织成pipefs,作为一种特殊的文件系统。pipefs在内核中并没有系统挂载点,所以用户是无法找到pipefs。
虽然管道可以进行进程间通信,但是pipe必须要在有创建关系的进程间才能通信,无法再任意两个进程间通信。命名管道(named pipe)和FIFO突破这种限制。它们可以在任意进程间通信。 FIFO和pipe的区别仅在于:
1.FIFO的索引节点被挂载到了系统目录,所以任意线程都可以访问到该节点。
2.FIFO是全双工通信,可以通过w/r打开一个FIFO。

有名管道内核实现

为什么FIFO可以被挂载到系统目录呢?我们一步一步来分析。内核中,FIFO是通过C函数mknod()进行创建。而该函数创建的是一个块设备文件。所以,一旦FIFO创建,VFS里就等于多了一个块设备文件。于是,自然也就可以挂载到/dev目录树中。FIFO块设备文件和普通的设备文件不同,FIFO没有对应的物理磁盘分区。对于普通的块设备,VFS在open的时候,会解析块设备所在的文件系统,在创建相关索引节点、目录项、文件对象后,调用对应文件系统函数读取磁盘上对应索引节点的信息。但是对于FIFO,当进程进行读写操作时,VFS会找到对应该块设备文件的读写操作指针,然后调用针对FIFO块设备文件的读写操作函数,这些函数是由块设备驱动函数具体实现。
学习Linux内核其实就是在学习各种文件系统。pipe、FIFO包括epoll机制,在Linux内核中都是作为特殊文件系统存在的。epoll在内核中是eventpollfs。

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值