2010-08-17 10 views

Antwort

18

Aus der Spitze von meinem Kopf und vorausgesetzt, Sie über Posix-Nachrichtenwarteschlangen sprechen (nicht die SysV sind):

  • Rohre sind nicht in der Größe begrenzt, Nachrichtenwarteschlangen sind.
  • Pipes können in Systemen mit Filedeskriptoren integriert werden, haben Nachrichtenwarteschlangen ihre eigene Reihe von Funktionen, obwohl Linux select() unterstützt, poll(), epoll() und Freunde auf dem mqd_t.
  • Rohre, sobald sie geschlossen sind, erfordern auf beiden Seiten ein gewisses Maß an Kooperation, um sie wieder herzustellen, Meldungswarteschlangen können geschlossen und auf beiden Seiten ohne die Koorporation der anderen Seite wieder geöffnet werden.
  • Pipes sind flach, ähnlich wie ein Stream, um eine Nachrichtenstruktur zu erzwingen, müssten Sie ein Protokoll auf beiden Seiten implementieren, Nachrichtenwarteschlangen sind bereits nachrichtenorientiert, es muss keine Sorgfalt verwendet werden, um beispielsweise die fünfte Nachricht zu erhalten die Warteschlange.
+0

ok, vielen Dank ... Aber ich habe ein wenig Zweifel "Pipes einmal geschlossen erfordert eine Art von Unterstützung auf beiden Seiten", Sie meinen, den Punkt zu markieren, dass Pipes nicht Kernel persistent und Message Queues sind .. Und genau welche Art von Unterstützung wird benötigt, um das Rohr wieder zu schließen, sobald es geschlossen ist? – mint9

+0

@ mint9: Im Allgemeinen müssen Sie das SIGPIPE abfangen, es elegant handhaben und dann das Rohr wieder öffnen. Ich stelle mir vor, du könntest deinen Prozess (auf beiden Seiten) abzweigen, deine Standardeingabe stupen, die Eltern laufen lassen (sie agieren als Wächter), dann lass deine Kinder sterben (auf beiden Seiten) und wiederhole die Gabel/Dup/Pipe-Verfahren. – hroptatyr

+0

Okie, ich habe es. Dank – mint9

9

Sie sind sehr unterschiedliche Dinge, wirklich.

Der größte praktische Unterschied ist, dass eine Pipe nicht den Begriff "Nachrichten" hat, es ist nur eine Pipe zu write() Bytes zu und read() Bytes von. Das empfangende Ende muss eine Möglichkeit haben zu wissen, welches Datenelement eine "Nachricht" in Ihrem Programm darstellt, und Sie müssen das selbst implementieren. Außerdem ist die Reihenfolge der Bytes definiert: Bytes werden in der Reihenfolge ausgegeben, in der Sie sie eingefügt haben. Und im Allgemeinen hat sie einen Eingang und einen Ausgang.

Eine Nachrichtenwarteschlange wird verwendet, um "Nachrichten" zu übertragen, die einen Typ und eine Größe haben. So kann das empfangende Ende einfach auf eine "Nachricht" mit einem bestimmten Typ warten, und Sie müssen sich keine Sorgen machen, ob dies vollständig ist oder nicht. Mehrere Prozesse können an dieselbe Warteschlange senden und von derselben Warteschlange empfangen.

siehe man mq_overview und/oder man svipc für weitere Informationen.

+1

sogar in der Warteschlange können Sie jede Struktur als Nachricht senden, so in diesem Fall auch das empfangende Ende muss wissen, "welche Daten in Ihrem Programm Nachricht bilden. –

Verwandte Themen