我一直在阅读有关 Linux 内核中如何实现管道的信息,并想验证我的理解。如果我不正确,将选择具有正确解释的答案。
- Linux有一个称为pipefs的VFS,它安装在内核中(而不是在用户空间中)
- pipelinefs 有一个超级块并安装在它自己的根 (
pipe:
) 旁边/
- 与大多数文件系统不同,pipefs 无法直接查看
- 进入pipefs是通过
pipe(2)
系统调用 pipe(2)
shell 使用操作员进行管道传输的系统调用(|
或从任何其他进程手动)在 pipelinefs 中创建一个新文件,其行为与普通文件非常相似- 管道运算符左侧的文件已
stdout
重定向到在 pipelinefs 中创建的临时文件 - 管道运算符右侧的文件已
stdin
设置为 pipelinefs 上的文件 - pipelinefs 存储在内存中,并且通过一些内核魔法,不应该被分页
这种对管道(例如)功能的解释是否ls -la | less
非常正确?
我不明白的一件事是像 bash 这样的东西如何设置进程'stdin
或.我还没有找到任何相关信息。stdout
pipe(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