Linux/Datei/Pipe: Unterschied zwischen den Versionen
K Textersetzung - „ z. B.“ durch „ beispielsweise“ |
|||
| (7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 2: | Zeile 2: | ||
== Beschreibung == | == Beschreibung == | ||
; Pipe | |||
* Pipeline | |||
* englisch ''Rohrleitung'' | |||
* [[Datenstrom]] | |||
* zwischen [[Prozess (Informatik)|Prozessen]] | |||
* durch einen [[Puffer (Informatik)|Puffer]] | |||
* Prinzip ''[[First In - First Out]]'' | |||
* (FIFO) | |||
Das bedeutet vereinfacht | |||
, dass | |||
ein Ergebnis eines [[Computerprogramm]]s als Eingabe eines weiteren Programms verwendet wird | |||
Pipes wurden 1973 von [[Douglas McIlroy]] für das Betriebssystem [[Unix]] entwickelt | |||
== Funktionsweise == | == Funktionsweise == | ||
| Zeile 29: | Zeile 40: | ||
== Erzeugen einer Pipe == | == Erzeugen einer Pipe == | ||
Unter den meisten Betriebssystemen und Programmiersprachen werden nach Anforderung einer Pipe durch den Systemaufruf ''<span style="font-family:monospace;">pipe()</span>'' vom [[Betriebssystem]] zwei Zugriffskennungen (engl.: ''[[handle]]s'') zurückgeliefert, die zum Schreiben in die bzw. | Unter den meisten Betriebssystemen und Programmiersprachen werden nach Anforderung einer Pipe durch den Systemaufruf ''<span style="font-family:monospace;">pipe()</span>'' vom [[Betriebssystem]] zwei Zugriffskennungen (engl.: ''[[handle]]s'') zurückgeliefert, die zum Schreiben in die bzw. | ||
* Lesen aus der Pipe benötigt werden. | * Lesen aus der Pipe benötigt werden. | ||
* Auch Kindprozesse erben den Zugriff auf diese ''handles''. | * Auch Kindprozesse erben den Zugriff auf diese ''handles''. | ||
| Zeile 70: | Zeile 81: | ||
Die an einer solchen Pipe beteiligten Programme nehmen (bis auf das erste) [[Eingabe (Computer)|Eingabedaten]] von ihrer [[Standardeingabe]] entgegen und stellen (bis auf das letzte) [[Ausgabe (Computer)|Ausgabedaten]] auf ihrer [[Standardausgabe]] bereit, siehe auch [[Filter (Unix)]]. | Die an einer solchen Pipe beteiligten Programme nehmen (bis auf das erste) [[Eingabe (Computer)|Eingabedaten]] von ihrer [[Standardeingabe]] entgegen und stellen (bis auf das letzte) [[Ausgabe (Computer)|Ausgabedaten]] auf ihrer [[Standardausgabe]] bereit, siehe auch [[Filter (Unix)]]. | ||
* Verlangt eine Anwendung die Angabe von Dateinamen für die Ein- oder Ausgabe, so kann man oft durch die Angabe eines Minuszeichens als Dateiname erreichen, dass auf die Standardausgabe geschrieben bzw. | * Verlangt eine Anwendung die Angabe von Dateinamen für die Ein- oder Ausgabe, so kann man oft durch die Angabe eines Minuszeichens als Dateiname erreichen, dass auf die Standardausgabe geschrieben bzw. | ||
* von der Standardeingabe gelesen wird. | * von der Standardeingabe gelesen wird. | ||
* Wenn sie diese Konvention implementiert haben, ist so das Schreiben in bzw. das Lesen aus einer Pipe auch mit solchen Anwendungen realisierbar. | * Wenn sie diese Konvention implementiert haben, ist so das Schreiben in bzw. das Lesen aus einer Pipe auch mit solchen Anwendungen realisierbar. | ||
| Zeile 92: | Zeile 103: | ||
* Das bedeutet, dass der gepufferte Inhalt verloren geht, wenn ein schreibender Prozess sein Ende der Pipe schließt, ohne dass ein lesender Prozess das andere Ende geöffnet hat. | * Das bedeutet, dass der gepufferte Inhalt verloren geht, wenn ein schreibender Prozess sein Ende der Pipe schließt, ohne dass ein lesender Prozess das andere Ende geöffnet hat. | ||
<noinclude> | <noinclude> | ||
| Zeile 153: | Zeile 108: | ||
== Anhang == | == Anhang == | ||
=== Siehe auch === | === Siehe auch === | ||
{{Special:PrefixIndex/ | <div style="column-count:2"> | ||
<categorytree hideroot=on mode="pages">Linux/Datei/Typ</categorytree> | |||
</div> | |||
---- | |||
{{Special:PrefixIndex/Linux/Datei/}} | |||
---- | ---- | ||
* [[Netcat]] | * [[Netcat]] | ||
=== Dokumentation === | |||
<!-- | |||
; Man-Page | |||
# [https://manpages.debian.org/stable/procps/pgrep.1.de.html prep(1)] | |||
; Info-Pages | |||
; Hinweise | |||
<div class="card h-100 bg-warning"> | |||
<div class="card-header">'''<big>Header</big>'''</div> | |||
<div class="card-body bg-white"> | |||
Hier steht der Kartentext | |||
</div> | |||
</div> | |||
--> | |||
=== Links === | === Links === | ||
==== Projekt ==== | |||
==== Weblinks ==== | ==== Weblinks ==== | ||
# https://de.wikipedia.org/wiki/Pipe_(Informatik) | # https://de.wikipedia.org/wiki/Pipe_(Informatik) | ||
# [https://msdn.microsoft.com/de-de/library/aa365780.aspx Dokumentation des Windows Pipe API] Microsoft Developer Network [MSDN] | # [https://msdn.microsoft.com/de-de/library/aa365780.aspx Dokumentation des Windows Pipe API] Microsoft Developer Network [MSDN] | ||
<!-- | |||
{{DEFAULTSORT:new}} | |||
{{DISPLAYTITLE:new}} | |||
--> | |||
[[Kategorie:Linux/Datei/Typ]] | [[Kategorie:Linux/Datei/Typ]] | ||
Aktuelle Version vom 1. November 2026, 12:25 Uhr
Pipe - Datenstrom zwischen zwei Prozessen durch einen Puffer mit dem Prinzip First In - First Out (FIFO)
Beschreibung
- Pipe
- Pipeline
- englisch Rohrleitung
- Datenstrom
- zwischen Prozessen
- durch einen Puffer
- Prinzip First In - First Out
- (FIFO)
Das bedeutet vereinfacht , dass ein Ergebnis eines Computerprogramms als Eingabe eines weiteren Programms verwendet wird
Pipes wurden 1973 von Douglas McIlroy für das Betriebssystem Unix entwickelt
Funktionsweise
- Beispiel
ls -R ./Bilder | grep -ic '\.jpg$'
Im Beispiel sind die zwei kleinen Programme ls und grep über eine Pipe (Symbol |) verbunden.
- Entsprechend der Unix-Philosophie sind beides Programme, die eine einzelne Aufgabe erledigen, auf Textströmen basieren und zusammen arbeiten können.
- das Programm ls dient dazu, den Inhalt von Dateipfaden in Textform zu listen
- grep ist ein Programm, das Texte nach Zeichenketten durchsuchen kann
Im Beispiel wird ls angewiesen, das Verzeichnis Bilder einschließlich der Unterverzeichnisse (Schalter R) zu listen.
- Das Ergebnis (einen Text) schickt ls in eine Pipe.
In der Pipe nimmt das Programm grep den Text in Empfang.
- Es wird angewiesen, den Text nach der Zeichenkette .jpg zu durchsuchen (der Punkt von ".jpg" wird mit einem Backslash maskiert, weil er für grep zwei Bedeutungen hat).
- Dem Programm grep wurden noch die Schalter i und c mitgegeben. i bewirkt, dass bei der Zeichenkette Groß- und Kleinbuchstaben gleich behandelt werden (es wird also auch "JPG" gefunden); der Schalter c weist grep an, nicht die Fundstellen zu listen, sondern deren Anzahl auszugeben.
Das Ergebnis der Pipe ist also die Anzahl der JPG-Bilder unterhalb des Verzeichnisses ./Bilder.
Auf den ersten Blick erscheint es einfacher, wenn man das Programm ls mit mehr Funktionalität ausstattet, um die umständliche Schreibweise der Pipe zu umgehen (wie der Befehl dir bei DOS und dessen Nachfolger).
- Anhänger der Unix-Philosophie betonen aber, dass das Aufteilen eines größeren Problems in Teilprobleme für entsprechend spezialisierte Programme effektiver sei.
Erzeugen einer Pipe
Unter den meisten Betriebssystemen und Programmiersprachen werden nach Anforderung einer Pipe durch den Systemaufruf pipe() vom Betriebssystem zwei Zugriffskennungen (engl.: handles) zurückgeliefert, die zum Schreiben in die bzw.
- Lesen aus der Pipe benötigt werden.
- Auch Kindprozesse erben den Zugriff auf diese handles.
- Mit der Beendigung des letzten Prozesses, der Zugriff auf eine aktive Pipe hat, wird diese vom Betriebssystem beendet.
Pipe-Varianten
- Anonyme Pipes
Einschränkungen
- Sie können nur in eine Richtung verwendet werden: ein Prozess schreibt, der andere liest.
- Sie können nur für die Kommunikation zwischen eng verwandten Prozessen benutzt werden.
- Die maximale Datenmenge, die eine Pipe enthalten kann, ist relativ klein.
- Benannte Pipes
Named Pipes
- können dagegen auch zur Kommunikation zwischen Prozessen eingesetzt werden, die nicht miteinander verwandt sind und sich darüber hinaus auf unterschiedlichen Rechnern innerhalb eines Netzwerkes befinden dürfen.
- Sie sind flexibler als anonyme Pipes und eignen sich für sogenannte Client-Server-Anwendungen (es lassen sich auch RPCs realisieren).
- Benannte Pipes ermöglichen die gleichzeitige Kommunikation in beide Richtungen, das heißt, Daten können im Vollduplexbetrieb zwischen den Prozessen ausgetauscht werden.
- Jeder Prozess, der den Namen einer benannten Pipe kennt, kann über diesen Namen die Verbindung zur Pipe und damit zu anderen Prozessen herstellen.
Pipes in Betriebssystemen
Pipes sind in verschiedenen Betriebssystemen realisiert, die meisten bieten sowohl anonyme als auch benannte Pipes.
Unix
Anonyme Pipes
Pipes sind unter Unix und unixoiden Betriebssystemen eines der mächtigsten Werkzeuge, um die sequentielle Abarbeitung von Befehlen auf einem bestimmten Datenbestand zu ermöglichen.
Bei einer anonymen Pipe ist die Kommunikation dabei auf mehrere Prozesse gleichen Ursprungs beschränkt.
- Diese (Ursprungs-)Beziehung entsteht meistens durch Forks.
- In der Shell wird eine anonyme Pipe zum Startzeitpunkt der Programme durch Eingabe eines "|"-Zeichens erzeugt.
- Die Shell ist dann der (gemeinsame) Elternprozess aller Prozesse und erledigt die Forks automatisch.
- Beispiel
grep '.sshd.*Invalid user' /var/log/messages | awk '{print $NF}' | sort -u
Hier wird die System-Logdatei nach dem Suchbegriff "sshd" durchsucht, dem in derselben Zeile der Text "Invalid user" folgt.
- Anschließend wird das letzte Feld aus der Meldung herausgeschnitten ("awk …"), das hier die IP-Adresse des Rechners enthält, von dem aus der ssh-Zugriff ausging.
- Zum Schluss werden diese IP-Adressen so sortiert, dass sie nicht mehrfach auftreten ("sort --unique").
Die an einer solchen Pipe beteiligten Programme nehmen (bis auf das erste) Eingabedaten von ihrer Standardeingabe entgegen und stellen (bis auf das letzte) Ausgabedaten auf ihrer Standardausgabe bereit, siehe auch Filter (Unix).
- Verlangt eine Anwendung die Angabe von Dateinamen für die Ein- oder Ausgabe, so kann man oft durch die Angabe eines Minuszeichens als Dateiname erreichen, dass auf die Standardausgabe geschrieben bzw.
- von der Standardeingabe gelesen wird.
- Wenn sie diese Konvention implementiert haben, ist so das Schreiben in bzw. das Lesen aus einer Pipe auch mit solchen Anwendungen realisierbar.
- Beispiel
tar cf - /home/user/ogg/mycolouringbook | ssh -l user server "cd /var/ogg && tar xvf -"
Hier wird der Inhalt eines Verzeichnisses mit tar zu einem Archiv zusammengepackt, über eine SSH-Verbindung zu einem anderen Rechner verschickt und dort entpackt.
Named Pipe
Eine Named Pipe, auch FIFO (von first-in-first-out) genannt, ist eine Pipe, die von zwei Prozessen zur Laufzeit über einen Dateinamen zum Lesen oder Schreiben geöffnet werden kann.
- Bei einer Named Pipe müssen die Prozesse keinen gemeinsamen Ursprung haben, die Prozesse müssen lediglich zum Zugriff auf die Pipe autorisiert sein und den Namen der Pipe kennen.
- Beispiel
mkfifo einefifo cat /var/log/messages > einefifo & grep sshd < einefifo
FIFOs überdauern die sie verwendenden Prozesse, weil sie Bestandteil des Dateisystems sind.
- Allerdings kann eine FIFO keinen Inhalt haben, solange sie von keinem Prozess geöffnet ist.
- Das bedeutet, dass der gepufferte Inhalt verloren geht, wenn ein schreibender Prozess sein Ende der Pipe schließt, ohne dass ein lesender Prozess das andere Ende geöffnet hat.
Anhang
Siehe auch
- Linux/Datei/Ausgabe
- Linux/Datei/Duplikate
- Linux/Datei/Eigenschaft
- Linux/Datei/Kompression/Archivformate
- Linux/Datei/Kompression/Archivmanager
- Linux/Datei/Link
- Linux/Datei/Name
- Linux/Datei/Name/bereinigen
- Linux/Datei/Pipe
- Linux/Datei/Pipe/Programmierung
- Linux/Datei/Typ
- Linux/Datei/Vergleich
- Linux/Datei/Zeit
Dokumentation
Links
Projekt
Weblinks
- https://de.wikipedia.org/wiki/Pipe_(Informatik)
- Dokumentation des Windows Pipe API Microsoft Developer Network [MSDN]