Unix-Domain-Socket VS Named Pipes?

Lesezeit: 3 Minuten

Nachdem ich mir einen Unix-Socket mit dem Namen angesehen hatte, dachte ich, sie seien Pipes. Ich habe mir Namenspfeifen angesehen und keinen großen Unterschied festgestellt. Ich habe gesehen, dass sie unterschiedlich initialisiert wurden, aber das ist das einzige, was mir auffällt. Beide verwenden die C-Schreib-/Lesefunktion und arbeiten AFAIK gleich.

Was ist der Unterschied zwischen Unix-Domain-Sockets und Named Pipes? Wann würde ich einen über den anderen ziehen? Was sollte ich standardmäßig verwenden (wie ich in C++ standardmäßig Vektor verwende, anstatt deque, list oder was auch immer zu verwenden, wenn ich Bedarf habe)?

  • @GregHewgill: Leider geht es bei dieser Frage eher um “Was ist IPC” als um den Unterschied, den ich frage: /. Ich habe das vor dem Posten gesehen, hätte ich verlinken und sagen sollen, dass es damit zusammenhängt? (war für mich nicht hilfreich)

    Benutzer34537

    28. Februar 2012 um 2:28 Uhr

  • @acid: Ja, es ist immer eine gute Idee, verwandte Fragen zu verlinken und zu erklären, welche Frage Sie noch haben.

    – Ben Voigt

    28. Februar 2012 um 4:12 Uhr

  • Dieser Artikel hat es ziemlich gut zusammengefasst. Entmystifizierung von Unix-Domain-Sockets: thomasstover.com/uds.html

    – Kong Ma

    3. März 2013 um 3:59 Uhr

  • Defekter Link: techdeviancy.com/uds.html

    – Macdado

    26. Dezember 2019 um 17:09 Uhr


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

  • Sie können sie für mehr als zwei kommunizierende Prozesse verwenden (z. B. einen Serverprozess mit potenziell mehreren Clientprozessen, die sich verbinden);
  • Sie sind bidirektional;
  • Sie unterstützen die Weitergabe von vom Kernel verifizierten UID/GID-Anmeldeinformationen zwischen Prozessen;
  • Sie unterstützen die Weitergabe von Dateideskriptoren zwischen Prozessen;
  • Sie unterstützen Paket- und sequenzierte Paketmodi.

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

  • Andererseits sollte vielleicht gesagt werden, dass Namenspipes den Vorteil haben, dass sie über gewöhnliche “angeschlossen” werden können open(2) -Aufrufe, wodurch sie sich besser zum Erstellen von Ad-hoc-Pipelines zwischen Programmen eignen, die normalerweise nur Dateinamen-Argumente entgegennehmen.

    – Dolda2000

    14. Mai 2016 um 23:58 Uhr

Benutzeravatar von jtoberon
jtoberon

Ein Unterschied besteht darin, dass benannte Pipes unidirektional sind, sodass Sie zwei davon verwenden müssen, um eine bidirektionale Kommunikation zu ermöglichen. Steckdosen sind natürlich zwei Wege. Etwas komplizierter erscheint es, zwei Variablen statt einer zu verwenden (also zwei Pipes statt einer Socket).

Auch der Wikipedia-Artikel ist ziemlich klar folgender Punkt: “Unix-Domain-Sockets können als Bytestreams oder als Datagrammsequenzen erstellt werden, während Pipes nur Bytestreams sind.”


Named Pipes sind zwar bidirektional, aber Halbduplex. Das bedeutet, dass die Kommunikation entweder von Ende A nach Ende B oder von B nach A gehen kann, aber niemals beides gleichzeitig.

  • hmm interessant +1. Weißt du zufällig, was der Unterschied zwischen Bytestream und Datagramm ist? Vielleicht ein Beispiel in ein oder zwei Sätzen, wie Sie es bereits für diese Frage getan haben?

    Benutzer34537

    28. Februar 2012 um 2:29 Uhr

  • @acidzombie: Eine Pipe oder ein Socket im Datagrammmodus behält Grenzen bei, so dass man write Aufruf erzeugt einen read Anruf. Im Stream-Modus können die Daten in einem langen Stream verkettet werden, sodass viele Schreibvorgänge gleichzeitig gelesen werden können oder umgekehrt. (Windows hat Datagramm-Pipes, laut jtoberons Antwort Unix nicht)

    – Ben Voigt

    28. Februar 2012 um 4:14 Uhr


  • @xaxxon: Hast du meinen Kommentar vollständig gelesen? Der Teil in Klammern erklärt, dass Windows sie hat, selbst wenn Unix sie nicht hat. Und wenn Sie überprüfen das CreateNamedPipe DokumentationSie werden sehen PIPE_TYPE_MESSAGE Flagge.

    – Ben Voigt

    1. September 2013 um 1:58 Uhr

  • @xaxxon: Sowohl Pipes als auch Unix-Domain-Sockets sind local, also verlustfrei ist, leert der Empfänger seine Queues überhaupt.

    – Ben Voigt

    1. September 2013 um 13:37 Uhr

  • Ja, nicht wie UDP, Datagramm Unix-Domain-Sockets sind garantiertIn-Order-Lieferung.

    – jtchitty

    21. Oktober 2016 um 5:37 Uhr

1424310cookie-checkUnix-Domain-Socket VS Named Pipes?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy