之前学习管道的时候,遇到一个问题,就是linux下的管道到底是如何实现的。

在 Linux 中,管道的实现并没有使用专门的数据结构,而是借助了文件系统的file结构和VFS的索引节点inode。通过将两个 file 结构指向同一个临时的 VFS 索引节点,而这个 VFS 索引节点又指向一个物理页面而实现的。

当然 这和网上大部分解释一样,并不能令人满意。


深入理解linux内核 P786 中有很好的解释

一下是我自己的理解,不清楚的 请查看上面的书籍。

管道创建 撤销



1.get_pipe_inode() 为pipefs中的管道 分配索引节点,并初始化
2.为 读/写通道 分配一个文件对象和文件描述符 并设置对应的读写权限
3.把两个文件对象和索引节点连在一起
4.两个文件 描述符返回给用户态进程

撤销
1.用户态进程对和管道相关的一个文件描述符调用close()系统调用,引用计数-1
2.当计数为0 ,调用release()方法 ,释放 管道缓冲页框

2.管道的读写
pipe_read()
1.获取索引节点的i_sem信号量 //我要读了
2.判断缓冲区 是否 空 ,或阻塞 //空不空啊?
阻塞: a .调用prepare_wait() 把当前进程(cur)加到等待队列
b.释放索引节信号量
c.调用 schedule()
d.cur一旦被唤醒,从等待队列中删除 。拷贝所有请求字节 //读
3.释放索引节点的i_sem信号量 //我读完了
4.唤醒管道中所有的写者进程 //你来写吧
5.返回 已经拷贝的字节数目 //读了这么多

pipe_write()
1.获取索引节点的i_sem信号量 //我要写了
2.检查是否至少有一个读进程, //有没有人正在读啊
如果不是,向当前进程发送 SIGPIPE信号,释放i_sem信号量 ,并返回-EPIPE
3.判断是否有足够的写空间, //满不满啊?
是,则向缓冲区 拷贝数据。如果不是非阻塞,释放索引节点并返回—EAGAIN; 如果不是且阻塞, 将当前写操作放入等待队列,释放信号量 ,调用schedule(),一旦被唤醒,返回 3 操作。
4.写入 所有请求的字节 //不满就写
5.释放索引节点信号量 //我写完了
6.唤醒所有等待队列的读进程 //快来读吧
7.返回写入的字节数目(如果没有写入 则返回错误码) //写了这么多

Linux管道的实现机制相关推荐

  1. linux 管道--转

    linux 管道 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别. ...

  2. Linux管道初步了解

    inux 管道 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别. 有 ...

  3. linux中管道的概念,浅谈Linux管道

    管道(pipe)是一个我们在学习Linux命令行的时候就会引入的一个很重要的概念.管道是UNIX环境中历史最悠久的进程间通信方式,从本质上说,管道也是一种文件,也是遵循UNIX的"一切皆文件 ...

  4. linux——管道详解

    管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别.有名管道叫named ...

  5. Linux入门-7 Linux管道、重定向以及文本处理

    Linux管道.重定向以及文本处理 1 Linux多命令协作:管道及重定向 管道和重定向 2 Linux命令行文本处理工具 文件浏览 基于关键字搜索-grep 基于列处理文本-cut 文本统计-wc ...

  6. 2017-2018-1 20155222 《信息安全系统设计基础》第10周 Linux下的IPC机制

    2017-2018-1 20155222 <信息安全系统设计基础>第10周 Linux下的IPC机制 IPC机制 在linux下的多个进程间的通信机制叫做IPC(Inter-Process ...

  7. linux 信号没有被处理方法,[计算机]Linux 信号signal处理机制.doc

    [计算机]Linux 信号signal处理机制 Linux 信号signal处理机制 信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使 ...

  8. Linux管道到底能有多快?

    [CSDN 编者按]本文作者通过一个示例程序,演示了通过Linux管道读写数据的性能优化过程,使吞吐量从最初的 3.5GiB/s,提高到最终的 65GiB/s.即便只是一个小例子,可它涉及的知识点却不 ...

  9. linux 进程通信机制,LINUX内核进程高效通信机制研究

    摘要:进程间的通信是多任务.多用户操作系统必须考虑的重大问题,Linux继承了Unix的基本设计思想,其安全性和稳定性得到了人们的认可,但随着其应用领域的不断拓展,其通信机制已经不能满足用户的需求.本 ...

最新文章

  1. column命令+pagesize命令+linesize命令+ttitle命令+btitle命令+break命令/comput命令
  2. 【深度学习】Tensorboard可视化模型训练过程和Colab使用
  3. 【Codeforces】CF 5 C Longest Regular Bracket Sequence(dp)
  4. excel根据rgb自动填充颜色_Excel一键定位空值与自动填充
  5. 联想服务器网卡型号怎么看,如何通过设备硬件ID判断无线网卡的品牌及型号
  6. C语言学习之两个乒乓球队进行比赛,各出3人。甲队为A,B,C3人,乙队为X,Y,Z3人。已抽签决定比赛名单。
  7. 搜狐视频怎么修改昵称
  8. JAVA 的面向对象设计的特点-书后感-01-21天学通JAVA-深入分析
  9. 60-150-046-使用-Sink-Flink落HDFS数据按事件时间分区解决方案
  10. 今天修改包名时出现 java.lang.ClassNotFoundException: com.myandroid.qqlogin1.MainActivity错误
  11. mysql geometry索引_Geometry——主流数据库空间索引技术
  12. 读《股票大作手回忆录》
  13. 薛兆丰·北大经济学课
  14. 15个漂亮的企业网站设计案例欣赏
  15. 浙江省软考报名时间成绩查询浙江省教育考试院浙江省人事考试网报名入口
  16. 谁知道下面这个视频中的特效是用什么软件做的?
  17. 实践练习二:手动部署 OceanBase 集群
  18. 十六.Elasticsearch Adjacency Matrix Aggregation
  19. “躲不开”的科技革命,第一季:远离舒适区!
  20. 126企业邮箱smtp服务器设置,网易企业邮箱新增超级邮件列表等功能

热门文章

  1. 去除面部黑色素小妙招_淡化脸上黑色素方法 几个简单小方法教你轻松白回来...
  2. App_Code里的类引用问题
  3. 不重视数据就可能被淘汰——大数据时代,你应该如何选择?
  4. 目标检测论文记录(1)
  5. 门面模式(外观模式)
  6. Forest 3.6.2中多种材质的混合使用与自定义编辑
  7. 北师19春计算机应用基础,北师19春《大学英语(三)》在线考核试卷【参考答案】...
  8. Python 第四篇 五角星绘图
  9. 高并发之——缓存思路
  10. js数组删除(splice和delete)