Was sind die Vorteile der Verwendung einer Named Pipe gegenüber einer unbenannten Pipe?

51

Ich habe eine Reihe von Interviewfragen durchgesehen, die von einem Unix-Administrator gestellt wurden. Ich habe ein Thema namens "named pipe" gefunden.

Ich habe das Thema gegoogelt. Bis zu einem gewissen Grad habe ich es verstanden: - Named Pipes || FIFO

Trotzdem habe ich das Gefühl, dass mir das Wissen fehlt, wann ich diesen speziellen Pfeifentyp verwenden soll. Gibt es spezielle Situationen, in denen unbenannte Pipes nicht funktionieren würden?

Ankit
quelle
Ein weiterer Link im technischen Forum: writeulearn.com/category/inter-process-communicationipc

Antworten:

39

Named Pipes (FIFO) haben vier drei Vorteile, die ich mir vorstellen kann:

  • Sie müssen die Lese- / Schreibvorgänge nicht gleichzeitig starten
  • Sie können mehrere Leser / Schreiber haben, die keine gemeinsame Abstammung benötigen
  • Als Datei können Sie den Besitz und die Berechtigungen steuern
  • sie sind bidirektional, unbenannte Pipes können unidirektional sein *

    *) Eines Standard - Shell Denken |Pipeline , die unidirektional ist, mehrere Schalen ( ksh, zsh, und bash) bieten auch Koprozesse , die eine bidirektionale Kommunikation erlauben. POSIX behandelt Pipes als Halbduplex (dh jede Seite kann nur lesen oder schreiben), der pipe()Systemaufruf gibt zwei Datei-Handles zurück, und Sie müssen möglicherweise eines als schreibgeschützt und das andere als schreibgeschützt behandeln. Einige (BSD-) Systeme unterstützen das gleichzeitige Lesen und Schreiben (nicht von POSIX verboten), andere benötigen zwei Pipes, eine für jede Richtung. Prüfen Sie pipe(), popen()und möglicherweise popen2()Mann Seiten. Die Undirektionalität ist möglicherweise nicht davon abhängig, ob die Pipe benannt ist oder nicht, obwohl sie von Linux 2.6 abhängig ist.

(Aktualisiert, dank des Feedbacks von Stephane Chazelas )

Eine sofort offensichtliche Aufgabe, die Sie mit einer unbenannten Pipe nicht lösen können, ist eine herkömmliche Client / Server-Anwendung.

Die letzte (geschlagen) Punkt oberhalb von etwa unidirektionalen Leitungen ist relevant für Linux, POSIX (siehe popen()) sagt , dass ein Rohr nur sein muss lesbar oder beschreibbar , auf Linux sie unidirektional sind . Weitere Informationen zu Linux finden Sie unter Grundlegendes zum Linux- Kernel (3rd Ed. O'Reilly) (S. 787). Andere Betriebssysteme bieten bidirektionale (unbenannte) Pipes an.

Nagios verwendet beispielsweise ein FIFO für seine Befehlsdatei . Verschiedene externe Prozesse (CGI-Skripte, externe Prüfungen, NRPE usw.) schreiben Befehle / Aktualisierungen in dieses FIFO und diese werden vom persistenten Nagios-Prozess verarbeitet.

Named Pipes verfügen über ähnliche Funktionen wie TCP-Verbindungen, es gibt jedoch wichtige Unterschiede. Da ein FIFO über einen dauerhaften Dateisystemnamen verfügt, können Sie darauf schreiben, auch wenn kein Lesegerät vorhanden ist. Zugegeben, die Schreibvorgänge werden blockiert (ohne asynchrone oder nicht blockierende E / A), obwohl Sie keine Daten verlieren, wenn der Empfänger dies nicht tut gestartet (oder wird neu gestartet).

Als Referenz siehe auch Steckdosen Unix - Domain , und die Antwort auf diese Frage Stackoverflow , der die wichtigsten fasst IPC - Methoden, und diese eine , die darüber spricht ,popen()

mr.spuratic
quelle
2
Sie können auch mehrere Reader / Writer mit unbenannten Pipes haben. Unter Linux sind sie nicht bidirektionaler als unamed pipe. Es gibt ein Schreibende und ein Leseende und die Daten fließen nur in eine Richtung. Wenn Sie ein FIFO im Schreibmodus öffnen, erhalten Sie das Schreibende, im Lesemodus das Leseende, im RW-Modus schreiben Sie an das Schreibende und lesen vom Lesemodus. Dies unterscheidet sich von bidirektionalen Pipes oder Unix-Domain-Sockets, bei denen Sie tatsächlich zwei separate Datenflüsse in jede Richtung haben.
Stéphane Chazelas
@StephaneChazelas danke für die Rückmeldung, ich habe die Antwort aktualisiert, um genauer zu sein und um (ich hoffe) Pfeifen und Direktionalität zu klären.
mr.spuratic
Umfasst die Kommunikation mit einer Named Pipe Festplatten-E / A? Oder ist alles in Erinnerung? Was bestimmt den Leistungsumfang dieser IPC-Mechanismen?
CMCDragonkai
15

Unbenannte oder anonyme Pipes bieten eine Möglichkeit zur Eins-zu-Eins-Interprozesskommunikation in eine Richtung zwischen verschiedenen Prozessen, die entweder durch eine Eltern-Kind-Beziehung oder durch Kinder eines gemeinsamen Elternteils, das die Pipes bereitstellt, wie z. B. einer Shell, verbunden sind Prozess. Da die Prozesse zusammenhängen, kann die Zuordnung von Dateideskriptoren zur Pipe implizit sein und erfordert kein Objekt mit einem Namen, der außerhalb der Prozesse liegt. Eine unbenannte Pipe existiert nur so lange, wie die Prozessin, die sie verwendet, offene Dateideskriptoren für die Pipe verwaltet. Wenn die Prozesse beendet werden und das Betriebssystem alle mit den Prozessen verbundenen Dateideskriptoren schließt, wird die unbenannte Pipe geschlossen.

Named Pipes sind eigentlich FIFOs. Dies sind persistente Objekte, die durch Knoten im Dateisystem dargestellt werden. Eine Named Pipe ermöglicht eine bidirektionale Kommunikation zwischen einem oder mehreren Prozessen, die nicht unbedingt miteinander verbunden sind und nicht gleichzeitig vorhanden sein müssen. Der Dateiname der Pipe dient als Adresse oder Vertrag zwischen den Kommunikationsprozessen. Wenn nur ein Prozess in eine Named Pipe schreibt und ein anderer Prozess aus der Named Pipe liest, verhält sich die Named Pipe wie eine unbenannte Pipe zwischen den beiden verwandten Prozessen.

Die kurze Antwort lautet also, dass Sie eine Named Pipe für die Kommunikation zwischen nicht verwandten Prozessen benötigen, die möglicherweise nicht gleichzeitig vorhanden sind.

Jonathan Ben-Avraham
quelle
+1 Ich denke, die Prozesse existieren so gut wie immer zur gleichen Zeit (ansonsten ist die Pipe ein wenig sinnlos - Sie können die Inhalte auch einfach in einer regulären Datei belassen). Diese und Unix-Domain-Sockets werden häufig von Daemon-Diensten verwendet, die z. B. über die Befehlszeile gesteuert werden können. Wenn Sie sich /runein Linux-Desktop-System ansehen, werden Sie wahrscheinlich einige von beiden finden (benannte Fifos- und Unix-Sockets). Es ist eine Form von IPC .
Goldlöckchen
2
@goldilocks: Eine Named Pipe wird häufig als speicherresidentes Ad-hoc-Postfach zwischen Prozessen in eingebetteten Systemen verwendet, bei denen die kommunizierenden Prozesse nur von kurzer Dauer sind und nicht gleichzeitig vorhanden sind. Der Vorteil ist die Einfachheit der Implementierung im Vergleich zum IPC mit gemeinsam genutztem Speicher und die Tatsache, dass nur RAM verwendet wird. Der Nachteil ist die Nicht-Persistenz zwischen Booten und die byteweise FIFO-Natur der Pipe gegenüber der Fähigkeit, eine Struktur mit gemeinsamem Speicher zu verwenden.
Jonathan Ben-Avraham
@jonathan: +1, ich habe einige Zweifel: - warum bezeichnen wir Named Pipes als FIFO; Was sind beständige Objekte?
Ankit
@Ankit: Manche Leute bezeichnen eine Named Pipe als FIFO, da sie sich wie eine FIFO-Datenstruktur verhält, insbesondere wenn sie von einem einzelnen Prozess zum Lesen und Schreiben geöffnet wird. Mit "persistentes Objekt" meine ich, dass eine Named Pipe einem Dateisystemobjekt zugeordnet ist. Das heißt, es handelt sich um einen Dateityp mit einem Namen, der dieselbe Persistenz aufweist wie alle anderen Dateien, die auf dem Datenträger gespeichert sind.
Jonathan Ben-Avraham
4

Ein Vorteil, der an anderer Stelle nicht erwähnt wird, ist, dass eine Named Pipe an Stellen verwendet werden kann, an denen nur eine Datei ausreicht.

Beispielsweise haben einige E-Mail-Clients die Funktion, den Inhalt von ~ / .signature an jede E-Mail-Nachricht anzuhängen. Wenn .signature eine Befehlszeilenoption wäre oder der E-Mail-Client feststellen könnte, dass .signature ausführbar ist, benötigen Sie keine Named Pipe. Wenn der E-Mail-Client jedoch nicht so ausgefeilt ist, können Sie eine Named Pipe mit dem Namen .signature erstellen und eine Anwendung ausführen, die bei jedem Lesen der Datei eine neue Signatur generiert.

Eyal
quelle
Interessant. Hast du eine solche Bewerbung? Es scheint, als müsste es auf Kernel-Ebene beobachten, wann auf das FIFO zugegriffen wird.
Wildcard
4

Named Pipes bieten einen weiteren Vorteil: Sie können sie systemübergreifend verwenden . Angenommen, Sie möchten die Echtzeitkommunikation von zwei Prozessen auf verschiedenen Computern ausführen. Dann teilen Sie einen Ordner zwischen den beiden, legen Sie Ihr FIFO auf den Ordner und los geht's. Es ist erheblich einfacher, als eine Anwendung, die für die Bearbeitung von Dateien entwickelt wurde, in einen Dienst zu verwandeln, der einen Port überwacht.

MariusMatutiae
quelle