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)?
Antworten:
UNIX-Domain-Sockets sind im Allgemeinen flexibler als Named Pipes. Einige ihrer Vorteile sind:
Um viele dieser Funktionen nutzen zu können, müssen Sie die
send()
/recv()
-Familie der Systemaufrufe anstelle vonwrite()
/ verwendenread()
.quelle
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.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.
quelle
write
Anruf einen Anruf erzeugtread
. 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)