Was genau ist der Unterschied zwischen Rohren und Bächen?

7

Ich habe über Pipes und Streams gelesen und bin immer noch verwirrt darüber, wie es implementiert wird.

Ein Programm wird gestartet und liest Daten aus dem Standard-Eingabestream (stdin), an den die Tastatur Daten sendet.

Meine Frage ist, wie unterscheidet sich das von einer Pfeife? Piping ermöglicht mir einen Prozess, der Daten an eine Pipe sendet, und ein anderer Prozess liest Daten daraus.

Wenn die Tastatur gedrückt wird, werden Daten an stdin gesendet und ein Programm liest Daten aus demselben Stream.

Eine "Lese" -Operation wird ausgeführt, sobald Daten wie bei einer Pipe an diesen Stream gesendet werden.

Sind diese Ströme geleitet?

user1091856
quelle

Antworten:

7

Unix Terminal I / O wurde traditionell als eine Art Warteschlange implementiert . Ältere Kernel verwendeten Clists. V8 Unix verwendete Streams . In den meisten Fällen werden Clists und Streams verwendet, um einen Teil der Verbindung zwischen einem Benutzerprozess (insbesondere einem Dateideskriptor) und einem Zeichengerätetreiber (z. B. einer seriellen Schnittstelle oder einem Pty) zu implementieren.

Pipes sind ebenfalls eine Warteschlange, verknüpfen jedoch Benutzerprozesse (insbesondere ein Paar Dateideskriptoren). Es gibt eine Vielzahl von Implementierungen von Rohren, einschließlich Muffen; eine spezielle Art von Datei; und sogar STREAMS (STREAMS ist eine Ableitung von V8-Streams.)

Streams und Pipes sind also beide Implementierungen einer Warteschlange, werden jedoch in unterschiedlichen Situationen verwendet.

Mark Plotnick
quelle
5

Dies ist aus technischer Sicht möglicherweise nicht ganz korrekt, kann jedoch zu Verwirrung führen. Ich neige dazu, einen Stream als etwas zu betrachten, das dem Programm eigen ist, wie z. B. STDIN, STDOUT und STDERR, während eine Pipe außerhalb des Programms liegt. Im Befehl sendet cat foo.txt | grep barder catBefehl beispielsweise an seine intrinsische STDOUT, die externe Pipe verbindet diese dann mit grepder intrinsischen STDIN.

John
quelle
Sie sagen, ein Stream ist nicht extern (wie eine Pipe), aber die Verbindung zwischen dem Programm und der Tastatur wird extern von einem Stream verwaltet. Das Programm liest nicht direkt von der Tastatur, sondern von einer Abstraktion, die der Stream ist.
user1091856
Aber Sie müssen nichts Besonderes tun, um diesen Stream zu erhalten - er ist einfach automatisch da. Das ist der wichtige Punkt für mich. Auch hier war ich vielleicht nicht ganz technisch korrekt, aber ich versuche, die Verwirrung zu beseitigen.
John