Pipe (Informatik)

Eine Pipe oder Pipeline (englisch Rohrleitung) ist ein Datenstrom zwischen zwei Prozessen durch einen Puffer mit dem 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 erfunden.

Funktionsweise anhand eines Beispiels

Das folgende Beispiel soll die Funktion einer Pipe erläutern:

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

Es gibt anonyme und benannte Pipes.

Anonyme Pipes unterliegen drei erheblichen 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 (Software). 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.

Verwendung einer unidirektionalen Unix-Pipe

Dieser Sourcecode bewirkt das gleiche wie die Shellanweisung who | sort

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main(void){

// pipe_verbindung[0] zum Lesen und pipe_verbindung[1] zum Schreiben
int pipe_verbindung[2];

//Initialisierung durch die Funktion Pipe
pipe(pipe_verbindung);

//Kindprozess erzeugen
if (fork()==0){
        // dup2 verbindet den Filedeskriptor der Pipe mit dem Filedeskriptor der Standardausgabe
        dup2(pipe_verbindung[1],1);

        // der Leseausgang muss geschlossen werden, da dieser Prozess nichts liest
        close(pipe_verbindung[0]);

         // Kommando ausführen, Standardausgabe des Kommandos ist mit der Pipe verbunden
        execlp("who","who",NULL);
        }
// dann zweiten Kindprozess erzeugen
else if (fork()==0){
        dup2(pipe_verbindung[0],0);
        close(pipe_verbindung[1]);
        execlp("sort","sort",NULL);
        }
}

Der schreibende Prozess (Prozess 1) hat zunächst auch lesenden Zugriff auf die Pipe (unidirektional). Deshalb muss er seinen Filedeskriptor(0) zum Lesen sperren. Genauso hat der lesende Prozess (Prozess 2) zunächst schreibenden Zugriff auf die Pipe. Deshalb muss er seinen Filedeskriptor(1) zum Schreiben sperren. Werden die nicht benötigten Deskriptoren nicht gesperrt, kommt es zu Komplikationen: Wenn zum Beispiel Prozess 1 keine Daten mehr zu versenden hat, terminiert er. Allerdings wird Prozess 2 nicht terminieren, da noch ein Filedeskriptor(1) zum Schreiben (sein eigener) für weitere Eingaben auf die Pipe gesetzt ist. Er wartet, aber es kommen keine Daten. Ein anderes denkbares Szenario ist, dass Prozess 1 nicht terminieren kann, weil er Lesezugriff auf die Pipe hat und für immer und ewig auf Daten des Gegenspielers wartet, aber niemals welche ankommen werden, da er erstens schon längst terminiert ist und zweitens auch niemals welche gesendet hat.

Windows

Windows kennt anonyme und benannte Pipes. Benannte Pipes lassen sich über das Pipe-API analog zu den SMB-Freigaben als \\ServerName\pipe\PipeName ansprechen.

Anonyme Pipes sind in der Windows-Eingabeaufforderung möglich, um z. B. mit dem find-Befehl in der Ausgabe eines dir-Befehls nur die Ausgaben zu erhalten, die bestimmte Zeichenketten im Pfad oder Dateinamen enthalten (was durch die dir-Syntax nicht immer vollständig abgedeckt ist): So gibt folgende Befehlseingabe alle Unterverzeichnisse mit enthaltenen .java Dateien aus, in denen im Pfad das Wort Render enthalten ist, sowie die .java Dateien selbst, in dessen Dateiname Render enthalten ist:

dir *.java /s | find "Render"

OS/2

OS/2 kennt anonyme und benannte Pipes. Benannte Pipes gehören zu den leistungsfähigsten IPC-Methoden, die OS/2 zu bieten hat. Wenn ein Server-Prozess eine benannte Pipe erzeugt, so kann er mehrere Instanzen dieser Pipe generieren, die alle unter demselben Namen angesprochen werden: Eine named pipe kann auch im Multiplexbetrieb arbeiten, so dass ein einzelner Server-Prozess mehrere Clients gleichzeitig bedienen kann.

Verwendung einer unnamed Pipe (anonyme Pipe) in C

Das Programm liest eine Benutzereingabe ein und nutzt dann eine Pipe, um die Daten einem Kindprozess mitzuteilen. Dieser wandelt alle Eingaben in Großbuchstaben (toupper) um und gibt diese aus.

#include <ctype.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Die maximale Laenge der Eingabe wird auf 2048 Bytes festgelegt.
#define MAX_ZEICHEN 2048

int main(void) {
	int fd[2], n, i;
	pid_t pid;
	char zeile[MAX_ZEICHEN];

	// Wir erstellen die Pipe. Tritt dabei ein Fehler auf, gibt die
	// Funktion -1 zurueck, so dass wir schon hier moegliche Fehler
	// abfangen und behandeln koennen.
	if (pipe(fd) < 0)
		fprintf(stderr, "Fehler beim Erstellen der pipe()");

	// Ein Kindprozess wird erstellt.
	if ((pid = fork()) > 0) {
		// Im Elternprozess
		close(fd[0]);
		fprintf(stdout, "Eltern : ");
		fgets(zeile, MAX_ZEICHEN, stdin);
		write(fd[1], zeile, strlen(zeile));

		if (waitpid(pid, NULL, 0) < 0)
			fprintf(stderr, "Fehler bei waitpid()");
	}

	// In den else-Zweig gelangt nur der Kindprozess
	else {
		// Im Kindprozess
		close(fd[1]);
		n = read(fd[0], zeile, MAX_ZEICHEN);

		for (i = 0; i < n; i++)
			zeile[i] = toupper(zeile[i]);
		fprintf(stderr, "Kind : ");

		write(STDOUT_FILENO, zeile, n);
	}
	exit(0);
}

Geschichte

Pipes wurden 1972/73 von Douglas McIlroy für das Betriebssystem Unix erfunden. Bereits 1964 hatte er zu Beginn des Multics-Projekt (dem Vorläufer von Unix) in einem Memo gefordert:

„We should have some ways of coupling programs like garden hose--screw in another segment when it becomes [...] necessary to massage [sic] data in another way.“

Douglas McIlroy[1]

Siehe auch

Einzelnachweise

  1. Dennis Ritchie: Advice from Doug Mcilroy

Read other articles:

Pour les articles homonymes, voir Panet. Bernard-Claude Panet Biographie Naissance 9 janvier 1753Québec (Nouvelle-France) Ordination sacerdotale 25 octobre 1778 Décès 14 février 1833 (à 80 ans)Québec (Bas-Canada) Évêque de l'Église catholique Ordination épiscopale 19 avril 1807 par Joseph-Octave Plessis Archevêque de Québec 4 décembre 1825 – 14 février 1833 Joseph-Octave Plessis Joseph Signay (en) Notice sur www.catholic-hierarchy.org modifier  Bernard-Claude Panet, ...

 

Оболонки Землі. Тектоносфера (рос. тектоносфера, англ. tectonosphere; нім. Tektonosphäre f) – зовнішня оболонка Землі (земна кора і верхня частина мантії), в якій відбуваються тектонічні, магматичні і метаморфічні процеси. Для Т. характерна вертикальна та горизонтальна неоднорідність ...

 

Artikel ini bukan mengenai Daftar kabupaten dan kota di Riau. Lambang Provinsi Kepulauan Riau Peta lokasi Provinsi Kepulauan Riau di Indonesia Peta lokasi Kabupaten di Kepulauan Riau Provinsi Kepulauan Riau merupakan salah satu provinsi di Pulau Sumatra. Provinsi Kepulauan Riau terdiri atas 5 Kabupaten dan 2 kota. Berikut adalah daftar Kabupaten dan Kota di Provinsi Kepulauan Riau. No. Kabupaten/kota Ibu kota Bupati/wali kota Luas wilayah (km2)[1] Jumlah Penduduk (2022)[1] Kec...

Fumizuki pada bulan Juli 1926 Sejarah Kekaisaran Jepang Nama FumizukiAsal nama JuliPembangun Fujinagata Shipyards, OsakaNomor galangan Perusak No. 29Pasang lunas 20 Oktober 1924Diluncurkan 16 Februari 1925Selesai 3 Juli 1926Ganti nama Fumizuki, 1 Agustus 1928[1]Dicoret 31 Maret 1944Identifikasi Nomor lambung: 29Nasib Tenggelam oleh pesawat Amerika pada 18 Februari 1944 Ciri-ciri umum Kelas dan jenis Kapal perusak kelas-MutsukiBerat benaman 1.336 t (1.315 ton panjang) (normal) 1.8...

 

أوين تشمبرلين (بالإنجليزية: Owen Chamberlain)‏    معلومات شخصية الميلاد 10 يوليو 1920[1][2][3][4][5][6]  سان فرانسيسكو[1]  الوفاة 28 فبراير 2006 (85 سنة) [2][3][4][5]  بيركيلي، كاليفورنيا  سبب الوفاة مرض باركنسون  مواطنة الولايات المتحدة&#...

 

Serekh Djet dengan elang Horus di atasnya Serekh Era: Kerajaan Baru(1550–1069 BC) Hieroglif Mesir Serekh merupakan jenis penting dari jambul heraldik yang digunakan di Mesir kuno. Seperti cartouche kemudian, yang berisi nama kerajaan. Penampilan Serekh adalah sebuah sketsa hias yang menggabungkan pandangan fasad istana dan plan (tampilan atas) halaman kerajaan. Kata serekh berasal dari kata Mesir untuk fasad. Serekh berbeda pada berbagai jenis tampilan objek yang tak terhitung jumlahny...

Unmanned aerial vehicle Bat Role Reconnaissance UAVType of aircraft National origin United States Manufacturer Northrop Grumman Designer Swift Engineering First flight 14 March 2006 The Northrop Grumman Bat is a medium-altitude unmanned air vehicle originally developed for use by the United States Armed Forces. Designed primarily as an intelligence ISR gathering tool, the Bat features 30 lb (14 kg) payload capacity that is unmatched[citation needed] in a 10 ft (3.0 ...

 

Parks of SingaporeFrom top left to right: Forest Walk at Southern Ridges, Pagodas at Chinese Garden, Chek Jawa at Pulau Ubin and Henderson WavesLocationVarious locations around SingaporeUseRecreationalSightsFlowering plants, Secondary forests There are numerous parks throughout the sovereign island country of Singapore. This is a list of parks in Singapore that are currently existing and have articles on Wikipedia. Most parks in Singapore are managed by the National Parks Board, although smal...

 

Japanese flautist This article relies largely or entirely on a single source. Relevant discussion may be found on the talk page. Please help improve this article by introducing citations to additional sources.Find sources: Katsuya Yokoyama – news · newspapers · books · scholar · JSTOR (April 2014) Katsuya YOKOYAMABorn(1934-12-02)December 2, 1934Shizuoka, JapanDiedApril 21, 2010(2010-04-21) (aged 75)Other names横山 勝也OccupationShakuhachi...

Square in Zagreb, Croatia Ban Jelačić SquareNative nameTrg bana Jelačića (Croatian)Former name(s)Harmica (until 1848)Republic Square (1946–1990)NamesakeBan Josip JelačićLocationDonji grad, Zagreb, CroatiaCoordinates45°48′47″N 15°58′38″E / 45.81306°N 15.97722°E / 45.81306; 15.97722NorthSplavnica and Harmica streetsEastJurišićeva StreetSouthPraška and Gajeva streetsWestIlica StreetConstructionCompletionc. 17th century Ban Jelačić Squar...

 

This article is about the album by the Mentors. For the Ian Dury song, see Sex & Drugs & Rock & Roll. For other uses, see Sex and drugs and rock and roll. 1989 studio album by MentorsSex, Drugs & Rock 'n' RollStudio album by MentorsReleasedDecember 1989RecordedLate 1970s, 1989StudioPortnow's Porn Palace, SeattleGenreHeavy metalLength50:36LabelEver RatMentors chronology Up the Dose / You Axed for It!(1989) Sex, Drugs & Rock 'n' Roll(1989) Rock Bible(1990) Sex, Drugs...

 

Upper class in Russian society before 1917 An assembly of nobility at the time of Catherine the Great (reigned 1762 – 1796) Maria Gendrikova's comital charter of 1742 The Russian nobility or dvoryanstvo (Russian: дворя́нство, romanized: dvorianstvo) arose in the Middle Ages. In 1914 it consisted of approximately 1,900,000 members (about 1.1% of the population)[citation needed] in the Russian Empire. Up until the February Revolution of 1917, the Russian noble estates ...

Legislative Assembly constituency in Karnataka, India ChikmagalurConstituency for the Karnataka Legislative AssemblyConstituency detailsCountryIndiaRegionSouth IndiaStateKarnatakaDistrictChikkamagaluruLS constituencyUdupi ChikmagalurReservationNoneMember of Legislative Assembly16th Karnataka Legislative AssemblyIncumbent H. D. Thammaiah PartyIndian National CongressElected year2023 Chikmagalur Assembly constituency is one of the 224 seats in Karnataka State Assembly in India. It is part of Ud...

 

2006 video gameGangs of LondonDeveloper(s)London StudioPublisher(s)Sony Computer EntertainmentPlatform(s)PlayStation PortableReleaseEU: 1 September 2006AU: 7 September 2006NA: 3 October 2006Genre(s)Action-adventureMode(s)Single-player Gangs of London is an action-adventure open world video game released in 2006 for Sony's PlayStation Portable console. The third installment in the The Getaway franchise following The Getaway (2002) and Black Monday (2004), it was developed by London Studio and ...

 

Halaman ini berisi artikel tentang aktor Amerika Serikat. Untuk pemotor Britania Raya, lihat Jimmie Simpson. Jimmi SimpsonJimmi Simpson berbicara di San Diego Comic-Con International 2017LahirJames Raymond Simpson21 November 1975 (umur 48)Hackettstown, New Jersey, A.S.PekerjaanAktorTahun aktif2000–sekarangSuami/istriMelanie Lynskey ​ ​(m. 2007; c. 2014)​ James Raymond Jimmi Simpson (lahir 21 November 1975) adalah aktor Amerika Serika...

Class of self-catalyzing ribozymes Group II catalytic intron, D5full secondary structure of group II intronIdentifiersSymbolIntron_gpIIRfamRF00029Other dataPDB structuresPDBe 6cihExtra informationEntry contains Splicing domain V (D5) and some consensus 3' to it. Group II catalytic intron, D1-D4IdentifiersSymbolgroup-II-D1D4RfamCL00102Other dataPDB structuresPDBe 4fb0Extra informationEntry contains D1-D4, parts 5' to D5. Group II introns are a large class of self-catalytic ribozymes and mobile...

 

Facility used to load coal into steam locomotives A steel coal tower at Grosmont Motive Power Depot, United Kingdom A coaling tower, coal stage, coaling plant or coaling station is a facility used to load coal as fuel into railway steam locomotives. Coaling towers were often sited at motive power depots or locomotive maintenance shops.[1] In the early years of railways, coal was shovelled by hand into locomotive tenders, the first attempt in Britain to replace manual labour by gravity...

 

Oldest surviving UK subscription library The Leeds Library interior The main room Blue plaque on the exterior The Leeds Library is the oldest surviving subscription library of its type in the UK. It was founded in 1768,[1] following an advertisement placed in the Leeds Intelligencer earlier that year. The first secretary was Joseph Priestley.[2] In 1779, James Boswell wrote, In Leeds, where one would not expect it, there is a very good public library, where strangers are treat...

CriaBD Centre religieux d'information et d'analyse de la BDLogo du CriaBD.HistoireFondation 1985CadreType Association à but non lucratifForme juridique Association sans but lucratifDomaines d'activité Bande dessinée, prix, exposition, festival, revueSiège Ville de Bruxellesmodifier - modifier le code - modifier Wikidata Le Centre religieux d'information et d'analyse de la BD (CriaBD) est une association sans but lucratif fondée en 1985 à Bruxelles, pour promouvoir la bande dessinée chr...

 

Concept car Motor vehicle Mercury Meta OneOverviewTypeConcept carManufacturerMercury (Ford)Production2005 (1 concept car)Body and chassisClassLuxury crossover SUVBody style5-door SUVLayoutFF layoutPlatformFord D3 platformRelatedFord FreestylePowertrainEngine2.7L AJD twin-turbocharged diesel V6TransmissionFord/ZF CVTDimensionsWheelbase112.9 in (2,868 mm)Length199.8 in (5,075 mm)Width73.0 in (1,854 mm)Curb weight4,251 lb (1,928 kg) The Mercury M...

 

Strategi Solo vs Squad di Free Fire: Cara Menang Mudah!