我一直在阅读有关如何在Linux内核中实现管道的信息,并希望验证我的理解。如果我不正确,将选择带有正确解释的答案。
- Linux有一个称为pipefs的VFS,它安装在内核中(而不是在用户空间中)
- pipefs有一个超级块,并安装在它自己的根目录(
pipe:
)旁边/
- 与大多数文件系统不同,无法直接查看pipefs
- pipefs的条目是通过
pipe(2)
syscall进行的 pipe(2)
外壳程序使用的syscall与|
操作员进行管道传输(或从任何其他进程手动进行管道传输)在pipefs中创建一个新文件,其行为与普通文件非常相似- 管道运算符左侧的文件已
stdout
重定向到pipefs中创建的临时文件 - 管道运算符右侧的文件已
stdin
设置为pipefs上的文件 - pipefs存储在内存中,并且通过一些内核魔术,不应进行分页
这种关于管道(例如ls -la | less
)功能如何的解释是否正确?
我不明白的一件事是,诸如bash之类的东西将如何设置进程stdin
或stdout
由返回的文件描述符pipe(2)
。我还没有找到任何关于此的信息。
是的,我具体是指较低级别的操作,并假设
—
Brandon Wamboldt 2014年
|
操作员只是pipe(2)
像bash 一样调用进程。
pipe()
与机器支持它(以及内核调用pipefs
等)比低得多的水平|
在你的shell提供的运营商。后者通常使用前者来实现,但不是必须如此。