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
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
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
14243100cookie-checkUnix-Domain-Socket VS Named Pipes?yes
@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