Ich habe nachgelesen, wie Pipes im Linux-Kernel implementiert sind, und wollte mein Verständnis überprüfen. Wenn ich falsch liege, wird die Antwort mit der richtigen Erklärung ausgewählt.
- Linux hat ein VFS namens pipefs, das im Kernel eingehängt ist (nicht im User Space)
- pipefs hat einen einzelnen Superblock und wird daneben an seiner eigenen root (
pipe:) gemountet/ - Pipefs können im Gegensatz zu den meisten Dateisystemen nicht direkt angezeigt werden
- Der Zugang zu pipefs erfolgt über den
pipe(2)Syscall - Der
pipe(2)Systemaufruf, der von Shells für die Weiterleitung an den|Operator (oder manuell von einem anderen Prozess) verwendet wird, erstellt eine neue Datei in Pipefs, die sich so ziemlich wie eine normale Datei verhält - Die Datei auf der linken Seite des Pipe-Operators wird
stdoutin die temporäre Datei umgeleitet, die in pipefs erstellt wurde - Die Datei auf der rechten Seite des Pipe-Operators ist
stdinauf die Datei auf Pipefs eingestellt - pipefs ist im Speicher gespeichert und sollte durch Kernelmagie nicht ausgelagert werden
Ist diese Erklärung, wie Pipes (z. B. ls -la | less) funktionieren, ziemlich korrekt?
Eine Sache, die ich nicht verstehe, ist, wie so etwas wie Bash einen Prozess stdinoder stdoutden von zurückgegebenen Dateideskriptor setzen würde pipe(2). Darüber habe ich noch nichts gefunden.
|Operator nur pipe(2)als ein Prozess aufruft , wie es Bash tut.
pipe()Kernel-Aufruf ist zusammen mit der Maschinerie, die ihn unterstützt (pipefsusw.), viel niedriger als der|Operator, der in Ihrer Shell angeboten wird. Letzteres wird normalerweise mit dem ersteren implementiert, muss es aber nicht sein.