Definition

Pipe

In der Computerprogrammierung, insbesondere in Unix-Betriebssystemen (OS), bezeichnet der Begriff Pipe eine Technik zur Weitergabe von Informationen von einem Programmprozess oder Befehl an einen anderen. Im Gegensatz zu anderen Formen der Interprozesskommunikation (IPC) – das heißt der Kommunikation zwischen verwandten Prozessen – gibt es bei einer Pipe Kommunikation nur in eine Richtung.

Normalerweise nimmt das Betriebssystem Eingaben von der Maus, der Tastatur oder einem anderen Eingabemechanismus entgegen und sendet die Ausgabe an den Bildschirm. Manchmal ist es jedoch erforderlich, dass die Ausgabe eines Befehls oder Prozesses an den nächsten weitergegeben werden, ohne dass die Daten durch das Eingabe- oder Ausgabegerät geleitet werden. In diesen Fällen kommt eine Software-Pipe zum Einsatz.

Eine Pipe bezeichnet einfach eine temporäre Softwareverbindung zwischen zwei Programmen oder Befehlen. Ein Bereich des Hauptspeichers wird wie eine virtuelle Datei behandelt, um Daten vorübergehend zu speichern und sie von einem Prozess zum anderen in eine Richtung weiterzuleiten.

In Betriebssystemen wie Unix leitet eine Pipe die Ausgabe eines Prozesses an einen anderen Prozess weiter. Der zweite (empfangende) Prozess, der als Filter bezeichnet wird, nimmt die Ausgabe als Eingabe entgegen. Er führt dann eine Operation an dieser Eingabe durch und schreibt das Ergebnis auf die Standardausgabe, zum Beispiel auf einen Bildschirm.

Das System hält die über die Pipeline übertragenen Informationen vorübergehend zurück, bis sie vom empfangenden Prozess gelesen werden können. Im Zweifelsfall wird er dafür angehalten, bis die Informationen geschrieben sind.

Kommunikation in eine Richtung

Eine Pipe funktioniert nach dem Prinzip first in, first out und verhält sich wie eine Warteschlangen-Datenstruktur. Bei einer Pipe wird die Ausgabe des ersten Prozesses zur Eingabe des zweiten. Der umgekehrte Fall tritt jedoch nicht ein. Aus diesem Grund ist eine Pipe eine Form der Einwegkommunikation zwischen Prozessen oder Befehlen. Für eine Zwei-Wege-Kommunikation sind zwei Pipes notwendig; eine für jede Richtung.

Eine Einschränkung der Pipes für IPC ist, dass die Prozesse, die die Pipes verwenden, einen gemeinsamen Elternprozess haben müssen. Einfach ausgedrückt, müssen sie einen gemeinsamen offenen oder initiierenden Prozess haben und das Ergebnis eines Fork-Systemaufrufs von einem Elternprozess sein.

Grafische Darstellung der Funktionsweise einer ipe
Abbildung 1: Eine Pipe ist in der Computerprogrammierung eine Technik zur Weitergabe von Daten zwischen Programmprozessen oder Befehlen.

Wie eine Pipe in Unix funktioniert

Pipes werden am häufigsten bei der Programmierung auf Unix-Systemen verwendet, um dort Programme, Prozesse oder Befehle miteinander zu verknüpfen. Statt große oder komplexe Programme zu erstellen, die viele verschiedene Aufgaben erfüllen sollen, erstellen die Programmierer mehrere kleine, die jeweils eine Aufgabe gut erfüllen und miteinander zusammenarbeiten. Dieses Programmiermodell wird als Pipes and Filter bezeichnet. Die Pipe stellt die Verbindung her, die eine Eingabe in einen Ausgabestrom umwandelt, während der Filter von der Standardeingabe liest, das Gelesene verarbeitet und dann in eine Standardausgabe schreibt.

In Unix-Systemen wird eine Pipe in einer Befehlszeile durch einen einfachen vertikalen Balken ( | ) zwischen zwei Befehlssequenzen angegeben. Ein Beispiel für die Syntax wäre somit: Befehl 1 | Befehl 2 | Befehl 3 |. Hierfür verwenden Sie eine interaktive Unix-Befehlsschnittstelle oder eine Unix-Shell. Die Ausgabe oder das Ergebnis der ersten Befehlssequenz wird zur Eingabe für die zweite Befehlssequenz. Der Pipe-Systemaufruf wird in ähnlicher Weise in Nicht-OS-Programmen verwendet.

Vorteile der Pipe in Unix

Im Allgemeinen stellt eine Pipe eine temporäre Verbindung zwischen zwei oder mehreren Befehlen, Programmen oder Prozessen her. In Unix- und Linux-Systemen ermöglicht eine Pipe eine komplexere Verarbeitung.

Eine Pipe kann auch zwei oder mehr Befehle, Prozesse oder Programme kombinieren. Auf diesem Weg ermöglicht die Pipe, dass sie gleichzeitig arbeiten und ihre individuelle Leistung vervielfachen können. Außerdem ermöglicht sie einen kontinuierlichen Datentransfer zwischen ihnen, so dass die Informationen nicht über temporäre Textdateien oder den Bildschirm übertragen werden müssen.

Beispiele für eine Pipe in Unix

In Unix werden Pipes häufig zum Filtern, Sortieren und Anzeigen des Textes in einer Liste verwendet. Eine weitere häufige Verwendung ist die Anzeige nur der einmaligen, nicht redundanten Einträge in einer Liste.

Beispiel 1: Sortieren der Daten in einer Liste und Anzeige der sortierten Daten auf dem Bildschirm

Angenommen, es gibt eine Liste von Namen in einer Datei namens names.txt:

  • Johannes
  • Sarah
  • David
  • Ahmad
  • Lakshmi
  • Kumar
  • Zacharias
  • Matteo

Um diese Liste zu sortieren, wird dieser Befehl mit einer Pipe verwendet:

$ Cat names.txt | sort

Dieser Befehl gibt die Namen in alphabetischer Reihenfolge aus:

  • Ahmad
  • David
  • Johannes
  • Kumar
  • Lakshmi
  • Matteo
  • Sarah
  • Zacharias

Beispiel 2: Nicht-redundante Werte auf dem Bildschirm anzeigen

Angenommen, es gibt eine Liste von Büchern in einer Datei namens books.txt mit mehreren redundanten Werten:

  • Harry Potter und der Stein der Weisen
  • Die Leiden des Jungen Werther
  • Die verlorene Ehre der Katharina Blum
  • 1984
  • Per Anhalter durch die Galaxis
  • Buddenbrooks
  • 1984
  • Harry Potter und der Stein der Weisen
  • Per Anhalter durch die Galaxis

Hier der Befehl und die Pipe, um die Namen zu sortieren und nur die nicht wiederholten Werte auf dem Bildschirm zu sehen:

$ Cat books.txt | sort | uniq

Hier ist die Ausgabe:

  • 1984
  • Buddenbrooks
  • Die Leiden des Jungen Werther
  • Die verlorene Ehre der Katharina Blum
  • Harry Potter und der Stein der Weisen
  • Per Anhalter durch die Galaxis

Parent und Child in der Pipe

Sowohl ein einzelner Prozess als auch seine Kindprozesse können die Pipe zum Lesen und Schreiben verwenden. Wenn es in einem Prozess einen Fork gibt, bleiben die Dateideskriptoren sowohl im Eltern- als auch im Kindprozess offen. Der Aufruf von fork nach dem Erstellen einer Pipe ermöglicht es dem Eltern- und dem Kindprozess, über die Pipe zu kommunizieren.

Nachdem der Eltern- und der Kindprozess das Schreiben und Lesen beendet haben, können sie den Prozess blockieren, statt ihn zu beenden. Infolgedessen erhält der Systemaufruf read entweder die angeforderten Daten oder die Daten in der Pipe, je nachdem, welcher Wert geringer ist. An diesem Punkt bleibt das Programm hängen oder friert ein.

Erfolgt ein read-Systemaufruf, wenn die Pipe leer ist und kein Prozess das schreibende Ende geöffnet hat, gibt der Befehl das Ende der Datei zurück (Rückgabewert 0). Wenn jedoch ein anderer Prozess die Pipe zum Schreiben geöffnet hat, blockiert ein Leseaufruf in Erwartung neuer Daten, die in die Pipe gelangen. Der Schreibvorgang beendet den übergeordneten Prozess, aber der untergeordnete Prozess wird nicht geschlossen, so dass die Codeausgabe hängen bleibt und das Programm nicht beendet wird.

Diese Definition wurde zuletzt im November 2022 aktualisiert

Erfahren Sie mehr über Serverhardware