Was heißen Pfeifen?

Antworten:

153

Sowohl auf Windows- als auch auf POSIX-Systemen bieten Named-Pipes eine Möglichkeit für die Kommunikation zwischen Prozessen zwischen Prozessen, die auf demselben Computer ausgeführt werden. Mit Named Pipes können Sie Ihre Daten senden, ohne dass die Leistung des Netzwerkstapels beeinträchtigt wird.

So wie ein Server eine IP-Adresse / einen IP-Port auf eingehende Anforderungen abhört, kann ein Server auch eine Named Pipe einrichten, die auf Anforderungen warten kann. In beiden Fällen muss der Clientprozess (oder die DB-Zugriffsbibliothek) die spezifische Adresse (oder den Pipe-Namen) kennen, um die Anforderung zu senden. Oft existiert ein häufig verwendeter Standardstandard (ähnlich wie Port 80 für HTTP verwendet SQL Server Port 1433 in TCP / IP; \\. \ Pipe \ sql \ query für eine Named Pipe).

Durch das Einrichten zusätzlicher Named Pipes können mehrere DB-Server mit jeweils eigenen Anforderungslistenern ausgeführt werden.

Der Vorteil von Named Pipes besteht darin, dass sie normalerweise viel schneller sind und Netzwerkstapelressourcen freisetzen.

- Übrigens können Sie in der Windows-Welt auch Named Pipes zu Remotecomputern haben. In diesem Fall wird die Named Pipe jedoch über TCP / IP transportiert, sodass Sie an Leistung verlieren. Verwenden Sie Named Pipes für die lokale Maschinenkommunikation.

Spielzeugbauer
quelle
1
Was ist der Nachteil?
Lindhe
2
@lindhe Keine automatische Bedienbarkeit im gesamten Netzwerk. In der Praxis in der Regel schwieriger einzurichten. Andere Implementierung in Windows als in Unix / Unix-ähnlichen Systemen. Sie sind cool, aber ich würde mich nicht darum kümmern, wenn Leistung nicht ein Muss ist.
Sudo
43

Unix und Windows haben beide Dinge, die als "Named Pipes" bezeichnet werden, aber sie verhalten sich unterschiedlich. Unter Unix ist eine Named Pipe eine Einbahnstraße, die normalerweise nur einen Leser und einen Schreiber hat - der Schreiber schreibt und der Leser liest, verstehen Sie?

Unter Windows ist das als "Named Pipe" bezeichnete Objekt ein IPC-Objekt, das eher einem TCP-Socket ähnelt. Es kann in beide Richtungen fließen, und es gibt einige Metadaten (Sie können die Anmeldeinformationen des Objekts am anderen Ende usw. abrufen).

Unix-Named Pipes werden als spezielle Datei im Dateisystem angezeigt und können mit normalen Datei-E / A-Befehlen einschließlich der Shell aufgerufen werden. Windows-Versionen tun dies nicht und müssen mit einem speziellen Systemaufruf geöffnet werden (danach verhalten sie sich meistens wie ein normales Win32-Handle).

Noch verwirrender ist, dass Unix einen sogenannten "Unix-Socket" oder AF_UNIX-Socket hat, der eher wie (aber nicht vollständig wie) eine win32 "Named Pipe" funktioniert und bidirektional ist.

MarkR
quelle
23


FIFO-Interproccess-Kommunikationsmechanismus ( Linux In Pipes First In First Out).

Unbenannte Pipes
In der Befehlszeile, dargestellt durch ein "|" zwischen zwei Befehlen.

Named Pipes
Eine FIFO-Spezialdatei. Einmal erstellt, können Sie die Pipe wie eine normale Datei verwenden (öffnen, schließen, schreiben, lesen usw.).

So erstellen Sie eine Named Pipe mit dem Namen "myPipe" über die Befehlszeile ( Manpage ):

mkfifo myPipe  

So erstellen Sie eine Named Pipe aus c, wobei "Pfadname" der Name ist, den die Pipe haben soll, und "Modus" die Berechtigungen enthält, die die Pipe haben soll ( Manpage ):

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
John Mulder
quelle
2
"Sie können die Pipe wie eine normale Datei verwenden" - nicht ganz richtig. Sie können weder tell()positionieren noch seek()in einem Rohr.
Nyov
19

Laut Wikipedia :

[...] Eine herkömmliche Pipe ist "unbenannt", da sie anonym existiert und nur so lange bestehen bleibt, wie der Prozess ausgeführt wird. Eine Named Pipe ist systembeständig und existiert über die Lebensdauer des Prozesses hinaus. Sie muss "nicht verbunden" oder gelöscht werden, sobald sie nicht mehr verwendet wird. Prozesse werden im Allgemeinen an die Named Pipe angehängt (normalerweise als Datei angezeigt), um IPC (Inter-Process-Kommunikation) durchzuführen.

Jonathan Lonowski
quelle
12

Vergleichen Sie

echo "test" | wc

zu

mkdnod apipe p
wc apipe

wc wird blockieren bis

echo "test" > apipe

wird ausgeführt

John Nilsson
quelle
7

Pipes sind eine Möglichkeit, Daten zwischen Anwendungen zu streamen. Unter Linux verwende ich dies ständig, um die Ausgabe eines Prozesses in einen anderen zu streamen. Dies ist anonym, da die Ziel-App keine Ahnung hat, woher dieser Eingabestream stammt. Das muss nicht sein.

Eine benannte Pipe ist nur eine Möglichkeit , aktiv auf ein bestehendes Rohr Einhaken und seine Daten hoovering-up. Dies gilt für Situationen, in denen der Anbieter nicht weiß, welche Kunden die Daten essen werden.

Oli
quelle
6

Dies ist ein Auszug aus Technet (also nicht sicher, warum die markierte Antwort besagt, dass benannte Pipes schneller sind?):

Named Pipes vs. TCP / IP-Sockets

In einer LAN-Umgebung (Fast Local Area Network) sind TCP / IP-Sockets (Transmission Control Protocol / Internet Protocol) und Named Pipes-Clients hinsichtlich der Leistung vergleichbar. Der Leistungsunterschied zwischen den TCP / IP-Sockets und den Named Pipes-Clients wird jedoch bei langsameren Netzwerken deutlich, z. B. in WANs (Wide Area Networks) oder DFÜ-Netzwerken. Dies liegt an der unterschiedlichen Art und Weise, wie die IPC-Mechanismen (Interprocess Communication) zwischen Peers kommunizieren.

Bei Named Pipes ist die Netzwerkkommunikation normalerweise interaktiver. Ein Peer sendet keine Daten, bis ein anderer Peer mit einem Lesebefehl danach fragt. Ein Netzwerklesevorgang umfasst normalerweise eine Reihe von Peek-Named-Pipes-Nachrichten, bevor mit dem Lesen der Daten begonnen wird. Diese können in einem langsamen Netzwerk sehr kostspielig sein und übermäßigen Netzwerkverkehr verursachen , der sich wiederum auf andere Netzwerkclients auswirkt.

Es ist auch wichtig zu klären, ob es sich um lokale Pipes oder Netzwerk-Pipes handelt. Wenn die Serveranwendung lokal auf dem Computer ausgeführt wird, auf dem eine Instanz von SQL Server ausgeführt wird, ist das lokale Named Pipes-Protokoll eine Option. Lokale Named Pipes laufen im Kernel-Modus und sind sehr schnell.

Bei TCP / IP-Sockets sind Datenübertragungen effizienter und haben weniger Overhead. Datenübertragungen können auch die Leistungsverbesserungsmechanismen von TCP / IP-Sockets nutzen, z. B. Fenster, verzögerte Bestätigungen usw. Dies kann in einem langsamen Netzwerk sehr hilfreich sein. Abhängig von der Art der Anwendungen können solche Leistungsunterschiede erheblich sein.

TCP / IP-Sockets unterstützen auch eine Backlog-Warteschlange. Dies kann im Vergleich zu Named Pipes einen begrenzten Glättungseffekt bieten, der zu Pipe-Busy-Fehlern führen kann, wenn Sie versuchen, eine Verbindung zu SQL Server herzustellen.

Im Allgemeinen wird TCP / IP in einem langsamen LAN-, WAN- oder DFÜ-Netzwerk bevorzugt, wohingegen Named Pipes eine bessere Wahl sein können, wenn die Netzwerkgeschwindigkeit keine Rolle spielt, da sie mehr Funktionalität, Benutzerfreundlichkeit und Konfigurationsoptionen bietet.

Ness
quelle
5

Prozessübergreifende Kommunikation (meistens) für Windows-Anwendungen. Ähnlich wie bei der Verwendung von Sockets für die Kommunikation zwischen Anwendungen unter Unix.

MSDN

Ken
quelle
4
Named Pipes erschienen in V6 oder AT & T Unix um 1975.
dmckee --- Ex-Moderator Kätzchen
Doh! Das ist ein bisschen vor Microsoft. Soweit ich weiß, werden sie in Unix / Linux-Anwendungen nicht oft verwendet. Wahr?
Ken
Ich verwende eine Named Pipe für meinen Generator für zufällige Signaturen. Da Mail- und Usenet-Apps erwarten, dass eine Datei mit dem Namen $ HOME / .signature Ihre Signatur enthält, erstellt mein Programm .signature als Named Pipe und schreibt zufällige Zitate in diese.
Paul Tomblin
3

Named Pipes in einem Unix / Linux-Kontext können verwendet werden, um zwei verschiedene Shells für die Kommunikation zu erstellen, da eine Shell einfach nichts mit einer anderen teilen kann.

Darüber hinaus kann ein Skript, das zweimal in derselben Shell instanziiert wurde, über die beiden Instanzen nichts gemeinsam nutzen. Ich habe beim Codieren eines Daemons, der die Funktionen start () und stop () enthält, eine Verwendung für Named Pipes gefunden und wollte dasselbe Skript verwenden, um die beiden Aktionen auszuführen.

Ohne Named Pipes (oder jede Art von Semaphor) ist das Starten des Skripts im Hintergrund kein Problem. Die Sache ist, wenn es fertig ist, können Sie einfach nicht auf die Instanz im Hintergrund zugreifen.

Wenn Sie ihm also den Befehl stop senden möchten, können Sie dies einfach nicht: Wenn Sie dasselbe Skript ohne Named Pipes ausführen und die Funktion stop () aufrufen, wird nichts ausgeführt, da Sie tatsächlich eine andere Instanz ausführen.

Die Lösung bestand darin, zwei Pipes zu implementieren, eine READ und eine WRITE, wenn Sie den Daemon starten. Lassen Sie ihn dann unter anderem die READ-Pipe anhören. Dann enthält die Stop () - Funktion einen Befehl, der eine Nachricht in die Pipe schreibt, die von dem im Hintergrund ausgeführten Skript verarbeitet wird, das einen Exit 0 ausführt. Auf diese Weise hat unsere zweite Instanz desselben Skripts nur folgende Aufgaben zu erledigen: Sagen Sie der ersten Instanz, sie soll aufhören.

Auf diese Weise kann sich nur ein Skript selbst starten und stoppen.

Natürlich haben Sie verschiedene Möglichkeiten, dies zu tun, indem Sie den Stopp beispielsweise durch Berühren auslösen. Aber dieser ist schön und interessant zu codieren.

Nicolas Mas
quelle
1

Named Pipes ist ein Windows-System für die Kommunikation zwischen Prozessen. Wenn sich der Server im Fall von SQL Server auf demselben Computer wie der Client befindet, können im Gegensatz zu TCP / IP Named Pipes zum Übertragen der Daten verwendet werden.

eulerfx
quelle
Es ist nicht nur Windows, wie Ihre Antwort es erscheinen lässt. Wie andere bereits bemerkt haben, gibt es Named Pipes seit den 70er Jahren unter UNIX, im Allgemeinen mit dem Anschein einer speziellen Datei. Trotzdem upvoted, aber korrigieren Sie Ihre Antwort.
Chris Charabaruk