Linux 中管道的工作原理

Linux 中管道的工作原理

我一直在阅读有关 Linux 内核中如何实现管道的信息,并想验证我的理解。如果我不正确,将选择具有正确解释的答案。

  • Linux有一个称为pipefs的VFS,它安装在内核中(而不是在用户空间中)
  • pipelinefs 有一个超级块并安装在它自己的根 ( pipe:) 旁边/
  • 与大多数文件系统不同,pipefs 无法直接查看
  • 进入pipefs是通过pipe(2)系统调用
  • pipe(2)shell 使用操作员进行管道传输的系统调用(|或从任何其他进程手动)在 pipelinefs 中创建一个新文件,其行为与普通文件非常相似
  • 管道运算符左侧的文件已stdout重定向到在 pipelinefs 中创建的临时文件
  • 管道运算符右侧的文件已stdin设置为 pipelinefs 上的文件
  • pipelinefs 存储在内存中,并且通过一些内核魔法,不应该被分页

这种对管道(例如)功能的解释是否ls -la | less非常正确?

我不明白的一件事是像 bash 这样的东西如何设置进程'stdin或.我还没有找到任何相关信息。stdoutpipe(2)

答案1

到目前为止,您的分析总体上是正确的。 shell 将进程的 stdin 设置为管道描述符的方式可能是(伪代码):

pipe(p) // create a new pipe with two handles p[0] and p[1]
fork() // spawn a child process
    close(p[0]) // close the write end of the pipe in the child
    dup2(p[1], 0) // duplicate the pipe descriptor on top of fd 0 (stdin)
    close(p[1]) // close the other pipe descriptor
    exec() // run a new process with the new descriptors in place

相关内容