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?
Antworten:
Named Pipes (FIFO) haben
vierdrei Vorteile, die ich mir vorstellen kann:sie sind bidirektional, unbenannte Pipes können unidirektional sein*(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()
quelle
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.
quelle
/run
ein Linux-Desktop-System ansehen, werden Sie wahrscheinlich einige von beiden finden (benannte Fifos- und Unix-Sockets). Es ist eine Form von IPC .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.
quelle
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.
quelle