私はLinuxカーネルでパイプがどのように実装されているのかを読んで、私が理解したことを確認したいと思いました。私が間違っている場合は、正しい説明を含む答えが選択されます。
- Linuxには、(ユーザー空間ではなく)カーネルにインストールされるPipefsというVFSがあります.
pipe:
パイプラインfsにはスーパーブロックがあり、独自のルート(/
- ほとんどのファイルシステムとは異なり、Pipefは直接表示できません。
- Pipefs 入力は
pipe(2)
システムコールを介して行われます。 pipe(2)
シェルは、オペレータのパイプシステム呼び出し(|
または他のプロセスで手動で)を使用して、通常のファイルと非常によく似た機能を持つパイプラインfsに新しいファイルを作成します。- パイプライン演算子の左側にあるファイルは、
stdout
パイプラインfsによって生成された一時ファイルにリダイレクトされます。 - パイプライン演算子の右側にあるファイルは、
stdin
パイプラインfsのファイルに設定されます。 - パイプラインfsはメモリに保存され、一部のカーネルマジックを介してページングされるべきではありません。
たとえば、パイプの機能の説明はls -la | less
非常に正確ですか?
私が理解していないことの1つは、bashのようなプロセスがどのように設定されるかですstdin
。または、これに関する情報が見つかりませんでした。stdout
pipe(2)
ベストアンサー1
あなたの分析は通常これまで正確です。シェルがプロセスの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