之前学习管道的时候,遇到一个问题,就是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. 2021年大数据Kafka(一):❤️消息队列和Kafka的基本介绍❤️
  2. libusb中的热插拔使用举例
  3. mongodb 安装包_MongoDB快速入门,掌握这些刚刚好!
  4. linux 查找文件_LINUX常用命令全集
  5. Sklearn 与 TensorFlow 机器学习实用指南(补档)
  6. 百度08年网页搜索份额73.2% 创历史新高
  7. AC+AP组网和MESH组网介绍和区别
  8. 最大生成树算法matlab,基于最大生成树的社团划分算法
  9. 漫威电影宇宙观影指南,口碑票房最佳都是谁
  10. 2021-07-30-DJ-005 Django模型的数据批量加载
  11. 未能联接game center服务器,game center连接不成功怎么办 有哪些修复步骤 - 驱动管家...
  12. Openstack rocky 部署四: neutron 部署与验证(控制节点)
  13. 读懂trace file (tkprof格式化) 6
  14. 漏洞复现 - - - Springboot未授权访问
  15. Frameworks Brightness
  16. European Journal of Operational Research 2023年第307卷第1期论文目录
  17. mysql5.7改登录密码_MYSQL 5.7 修改密码、登录问题
  18. python做k线图_python做k线图(15分钟k线的意义)
  19. 反色(顺序)C C++
  20. CUHK-SYSU数据集介绍

热门文章

  1. python 卡方检验批量筛选_表格卡方检验-一键在线测试
  2. [原创][从mambo到joomla的迁移实战之三]网站由mambo迁移到joomla(未完待续)
  3. 数据科学导论学习小结——其一
  4. python中map函数定义及使用方法、技巧
  5. 使用手机百度客户端怎么抢火车票呢
  6. 弹出菜单PopupMenu
  7. xpath常用的定位方法
  8. Angular开发者指南(七)依赖注入
  9. iOS 命令行安装app - ideviceinstaller
  10. Delays between passcode attempts [iDevice]