• Linux管道的工作过程


    常用的匿名管道(Anonymous Pipes),也即将多个命令串起来的竖线。管道的创建,需要通过下面这个系统调用。

    int pipe(int fd[2])

    我们创建了一个管道 pipe,返回了两个文件描述符,这表示管道的两端,一个是管道的读取端描述符 fd[0],另一个是管道的写入端描述符 fd[1]。

    所谓的匿名管道,其实就是内核里面的一串缓存。

    我们首先从 shell 创建子进程 A,然后在 shell 和 A 之间建立一个管道,其中 shell 保留读取端,A 进程保留写入端,然后 shell 再创建子进程 B。这又是一次 fork,所以,shell 里面保留的读取端的 fd 也被复制到了子进程 B 里面。这个时候,相当于 shell 和 B 都保留读取端,只要 shell 主动关闭读取端,就变成了一管道,写入端在 A 进程,读取端在 B 进程。

    无论是匿名管道,还是命名管道,在内核都是一个文件。只要是文件就要有一个 inode。这特殊 inode、字符设备、块设备,其实都是这种特殊的 inode。

    在这种特殊的 inode 里面,file_operations 指向管道特殊的 pipefifo_fops,这个 inode 对应内存里面的缓存。

    当我们用文件的 open 函数打开这个管道设备文件的时候,会调用 pipefifo_fops 里面的方法创建 struct file 结构,他的 inode 指向特殊的 inode,也对应内存里面的缓存,file_operations 也指向管道特殊的 pipefifo_fops。

    写入一个 pipe 就是从 struct file 结构找到缓存写入,读取一个 pipe 就是从 struct file 结构找到缓存读出。

    此文章为11月Day19学习笔记,内容来源于极客时间《趣谈Linux操作系统》,推荐该课程。

  • 相关阅读:
    阶段六-Day03-MyBatis1
    计算化学:如何在云平台上计算声子谱
    【机器学习】python实现随机森林
    谈谈看法:程序员为什么越跳薪资越高?
    VUE3-博客全栈 08-前端
    QFSFileEngine::open: No file name specified解决方案
    全球无人驾驶大洗牌,百度Apollo Day宣告Robotaxi进入2.0时代
    线程基础知识复习
    【Vue】Vue全家桶(九)Vue3
    生活消费分销系统搭建开发制作
  • 原文地址:https://blog.csdn.net/key_3_feng/article/details/134497103