Linuxでパイプがどのように機能するか

Linuxでパイプがどのように機能するか

私はLinuxカーネルでパイプがどのように実装されているのかを読んで、私が理解したことを確認したいと思いました。私が間違っている場合は、正しい説明を含む答えが選択されます。

  • Linuxには、(ユーザー空間ではなく)カーネルにインストールされるPipefsというVFSがあります.
  • pipe:パイプラインfsにはスーパーブロックがあり、独自のルート(/
  • ほとんどのファイルシステムとは異なり、Pipefは直接表示できません。
  • Pipefs 入力はpipe(2)システムコールを介して行われます。
  • pipe(2)シェルは、オペレータのパイプシステム呼び出し(|または他のプロセスで手動で)を使用して、通常のファイルと非常によく似た機能を持つパイプラインfsに新しいファイルを作成します。
  • パイプライン演算子の左側にあるファイルは、stdoutパイプラインfsによって生成された一時ファイルにリダイレクトされます。
  • パイプライン演算子の右側にあるファイルは、stdinパイプラインfsのファイルに設定されます。
  • パイプラインfsはメモリに保存され、一部のカーネルマジックを介してページングされるべきではありません。

たとえば、パイプの機能の説明はls -la | less非常に正確ですか?

私が理解していないことの1つは、bashのようなプロセスがどのように設定されるかですstdin。または、これに関する情報が見つかりませんでした。stdoutpipe(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

おすすめ記事