Was ist der Unterschied zwischen Nachrichtenwarteschlangen und einer Pipe in Linux?Pipe vs msg Warteschlange
Antwort
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 demmqd_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.
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.
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. –
- 1. throw Fehler ('msg') vs werfen neuen Fehler ('msg')
- 2. Redis-Warteschlange vs MSMQ
- 3. ZeroMQ vs Oracle Warteschlange
- 4. Pipe getrennt vs. separate Zeilen
- 5. Liste vs Warteschlange vs Sammlung in Java
- 6. Warteschlange vs Dequeue in Java
- 7. Kann jemand Wissen über JMS-Warteschlange vs VM-Warteschlange teilen. Wo vm Warteschlange Nachrichten beibehalten?
- 8. Jquery Validierung msg ändern (Custom msg set)
- 9. Java newSingleThreadExecutor vs eigenen Thread mit Warteschlange
- 10. API-Server - Warteschlangendienst vs lokale Mini-Warteschlange
- 11. Wie bekomme ich zurück msg queue id
- 12. Mehrdeutige Überladung von Funktionen wie `msg (long)` mit Kandidaten `msg (int32_t)` und `msg (int64_t)`
- 13. SQL Server: Fehler MSG 102 und MSG 156
- 14. Outlook lesen .msg Datei
- 15. Alarm msg Onclick-Ereignis
- 16. Lesen von MSG-Dateien
- 17. Vaadin msg ACHTUNG: Versuchte
- 18. HTTPResponse (msg) Überschreiben!
- 19. Chain of Responsibility vs Befehle in einer Warteschlange oder Stack
- 20. Ansible jinja2 filter '|' (pipe) was bedeutet das?
- 21. received-im-msg signal message
- 22. Mehrdeutiger Typ variabler Fehler msg
- 23. .msg zu eml Konvertierungsprobleme Outlook
- 24. Übergabe eines img durch msg
- 25. Speicher ‚MailItem‘ Objekt als msg
- 26. Msg 512 ... SQL Server Code
- 27. Warum kann eine mit der Funktion pipe() erstellte Pipe nicht als bidirektionale Pipe verwendet werden?
- 28. Sind Unix-Pipe (|) und Pipe wir erstellen mit "Pipe (int Pipefd [2])" in c die gleiche?
- 29. eckige2-Standard-Datums-Pipe, Nummern-Pipe und Währungs-Pipe funktioniert nicht mit Null-Werten
- 30. Warteschlange: hören Timeout stoppen Verarbeitung Warteschlange Verarbeitung
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
@ 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
Okie, ich habe es. Dank – mint9