Unix Domain Socket VS Named Pipes?

122

Nachdem ich mir ein Unix namens Socket angesehen hatte und dachte, sie wären Pipes. Ich schaute auf Namenspfeifen und sah keinen großen Unterschied. Ich habe gesehen, dass sie anders initialisiert wurden, aber das ist das einzige, was mir auffällt. Beide verwenden die C-Schreib- / Lesefunktion und arbeiten gleichermaßen mit AFAIK.

Was ist der Unterschied zwischen Unix-Domain-Sockets und Named Pipes? Wann würde ich eins über das andere wählen? Welches sollte ich standardmäßig verwenden (wie ich standardmäßig Vektor in C ++ verwende als deque, list oder was auch immer, wenn ich Bedürfnisse habe)?


quelle
1
@ GregHewgill: Leider ist diese Frage eher "was ist IPC" als der Unterschied, den ich frage: /. Ich habe das vor dem Posten gesehen, hätte ich verlinken und sagen sollen, dass es verwandt ist? (es war nicht hilfreich für mich)
1
@acid: Ja, verwandte Fragen zu verknüpfen und zu erklären, welche Frage Sie noch haben, ist immer eine gute Idee.
Ben Voigt
3
Dieser Artikel hat es ziemlich gut zusammengefasst. Entmystifizierung von Unix-Domain-Sockets: thomasstover.com/uds.html
Cong Ma
Unterbrochener Link: techdeviancy.com/uds.html
mcdado

Antworten:

106

UNIX-Domain-Sockets sind im Allgemeinen flexibler als Named Pipes. Einige ihrer Vorteile sind:

  • Sie können sie für mehr als zwei Kommunikationsprozesse verwenden (z. B. einen Serverprozess mit möglicherweise mehreren Clientprozessen, die eine Verbindung herstellen).
  • Sie sind bidirektional;
  • Sie unterstützen die Weitergabe von kernelverifizierten UID / GID-Anmeldeinformationen zwischen Prozessen.
  • Sie unterstützen die Übergabe von Dateideskriptoren zwischen Prozessen.
  • Sie unterstützen Paket- und sequenzierte Paketmodi.

Um viele dieser Funktionen nutzen zu können, müssen Sie die send()/ recv()-Familie der Systemaufrufe anstelle von write()/ verwenden read().

caf
quelle
11
Andererseits sollte vielleicht gesagt werden, dass Namenspipes den Vorteil haben, dass sie über normale open(2)Aufrufe "verbunden" werden können , wodurch sie besser für die Erstellung von Ad-hoc-Pipelines zwischen Programmen geeignet sind, die normalerweise nur Dateinamenargumente verwenden.
Dolda2000
66

Ein Unterschied besteht darin, dass Named Pipes einseitig sind. Sie müssen also zwei davon verwenden, um eine bidirektionale Kommunikation durchzuführen. Steckdosen sind natürlich in beide Richtungen. Es scheint etwas komplizierter zu sein, zwei Variablen anstelle von einer zu verwenden (dh zwei Pipes anstelle eines Sockets).

Der Wikipedia-Artikel ist auch in folgendem Punkt ziemlich klar : "Unix-Domain-Sockets können als Byte-Streams oder als Datagramm-Sequenzen erstellt werden, während Pipes nur Byte-Streams sind."


Benannte Rohre sind in der Tat bidirektional, aber halbduplex . Dies bedeutet, dass die Kommunikation entweder von Ende A nach Ende B oder von B nach A gehen kann, jedoch niemals beide gleichzeitig.

jtoberon
quelle
1
hmm interessant +1. Wissen Sie zufällig, was der Unterschied zwischen Bytestream und Datagramm ist? Vielleicht ein Beispiel in ein oder zwei Sentances, wie Sie es bereits für diese Frage getan haben?
7
@acidzombie: Eine Pipe oder ein Socket im Datagramm-Modus behält Grenzen bei, sodass ein writeAnruf einen Anruf erzeugt read. Im Stream-Modus können die Daten in einem langen Stream miteinander verknüpft werden, sodass viele Schreibvorgänge gleichzeitig gelesen werden können oder umgekehrt. (Windows hat Datagramm-Pipes, laut Jtoberons Antwort Unix nicht)
Ben Voigt
1
@ BenVoigt Nun, die Zustellung von Datagramm-Socket-Paketen ist unzuverlässig, sodass ein Schreibvorgang nicht unbedingt einen Leseaufruf generiert. Vielleicht für lokale Steckdosen, aber das geht aus Ihrem Kommentar nicht hervor. Also egal es hat Probleme.
Xaxxon
3
@xaxxon: Sowohl Pipes als auch Unix-Domain-Sockets sind lokal, so verlustfrei, dass der Empfänger seine Warteschlangen überhaupt leert.
Ben Voigt
6
Ja, im Gegensatz zu UDP werden Datagramm-Unix-Domain-Sockets garantiert und in der richtigen Reihenfolge geliefert.
Jtchitty