Linuxカーネルにパイプがどのように実装されているかを読んでいて、私の理解を検証したかったのです。私が間違っている場合は、正しい説明の答えが選択されます。
- Linuxには(ユーザー空間ではなく)カーネルにマウントされるpipefsと呼ばれるVFSがあります
- pipefsには単一のスーパーブロックがあり、独自のルート(
pipe:
)にマウントされます。/
- ほとんどのファイルシステムとは異なり、pipefsは直接表示できません
- pipefsへのエントリは
pipe(2)
syscall 経由です pipe(2)
配管用のシェルが使用するシステムコール|
オペレータ(または手動で任意の他のプロセスからは)ほとんど通常のファイルと同じように動作しpipefsに新しいファイルを作成します- パイプオペレーターの左側の
stdout
ファイルは、pipefsで作成された一時ファイルにリダイレクトされます。 - パイプ演算子の右側のファイルには、
stdin
pipefs上のファイルが設定されています。 - pipefsはメモリに格納されており、いくつかのカーネルマジックによってページングされるべきではありません
パイプ(例ls -la | less
)がどのように機能するかについてのこの説明はほとんど正しいですか?
私が理解していないことの1つは、bashのようなものがどのようにプロセスを設定するstdin
かstdout
、またはによって返されるファイル記述子に設定することpipe(2)
です。私はまだそれについて何も見つけることができませんでした。
はい、私は具体的に低レベルの操作について言及していますが、
—
ブランドンワンボルト14
|
オペレーターはpipe(2)
bashのようにプロセスとして呼び出しているだけであるという前提で。
pipe()
機械それがサポートしていることを(一緒にカーネルの呼び出しpipefs
など)よりもはるかに低いレベルである|
シェルで提供事業者。後者は通常前者を使用して実装されますが、そうである必要はありません。