• 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操作系统》,推荐该课程。

  • 相关阅读:
    Mamba来了,Python conda加速神奇,体验飞一般的感觉
    卡尔曼滤波与融合算法
    Java错误:找不到或无法加载主类
    QEvent(事件)
    煤炉、Newegg测评自养号环境搭建技术
    PTA天梯赛座位分配
    分治算法- 递归的分析
    Kratos战神微服务框架(二)
    mac 环境docker占用空间清除
    达梦、Oracle、PostgreSQL查询全部表备注,表字段,全部字段备注,全部索引,全部字段类型
  • 原文地址:https://blog.csdn.net/key_3_feng/article/details/134497103