Message Queues
Strukturierte Nachrichtenübermittlung
Message Queues ist eine kostenlose C Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C Academy-Kurs umfasst insgesamt 4 Lektionen.
Strukturierte Nachrichten
Eine Nachrichtenwarteschlange ermöglicht es Prozessen, einzelne Nachrichten statt eines rohen Bytestroms auszutauschen. Der Kernel bewahrt die Nachrichtengrenzen, sodass jeder Sendevorgang genau einem Empfang entspricht.
Nachrichten und Datenströme
Pipes liefern einen Bytestrom, bei dem die Grenzen verschwimmen. Nachrichtenwarteschlangen liefern vollständige Einheiten:
- Jeder
sendentspricht einer Nachricht - Jeder
receivegibt eine Nachricht zurück - Nachrichten können priorisiert werden
POSIX- und System-V-Warteschlangen
Es gibt zwei APIs:
- POSIX:
mq_open,mq_send,mq_receive, mit einem Schrägstrich benannt - System V:
msgget,msgsnd,msgrcv, schlüsselbasiert mit typisierten Nachrichten
POSIX ist die übersichtlichere, moderne Wahl.
Eine Warteschlange öffnen
mq_open erstellt oder öffnet eine benannte Warteschlange und gibt einen Deskriptor zurück. Sie können Attribute wie die maximale Nachrichtenanzahl und -größe übergeben.
#include <mqueue.h>
#include <fcntl.h>
mqd_t open_queue(const char *name) {
return mq_open(name, O_CREAT | O_RDWR, 0644, NULL);
/* name like "/myqueue"; NULL uses default attributes */
}Attribute der Warteschlange
struct mq_attr definiert mq_maxmsg (Kapazität) und mq_msgsize (maximale Byteanzahl pro Nachricht). Der Puffer des Empfängers muss mindestens mq_msgsize groß sein.
#include <mqueue.h>
void set_attr(struct mq_attr *a) {
a->mq_flags = 0;
a->mq_maxmsg = 10; /* up to 10 queued messages */
a->mq_msgsize = 256; /* each at most 256 bytes */
a->mq_curmsgs = 0;
}Eine Nachricht senden
mq_send legt eine Nachricht mit einer Priorität in der Warteschlange ab. Nachrichten mit höherer Priorität werden zuerst zugestellt.
#include <mqueue.h>
#include <string.h>
int post(mqd_t q, const char *text) {
return mq_send(q, text, strlen(text) + 1, 5); /* priority 5 */
}Eine Nachricht empfangen
mq_receive gibt die Nachricht mit der höchsten Priorität zurück. Der Puffer muss mindestens mq_msgsize groß sein, andernfalls schlägt der Aufruf mit EMSGSIZE fehl.
#include <mqueue.h>
#include <stdio.h>
void get(mqd_t q, size_t msgsize) {
char buf[256];
unsigned prio;
ssize_t n = mq_receive(q, buf, msgsize, &prio);
if (n >= 0) printf("got (prio %u): %s\n", prio, buf);
}Prioritäten bestimmen die Zustellung
Anders als eine FIFO-Pipe liefert eine Nachrichtenwarteschlange Nachrichten zuerst nach Priorität und innerhalb derselben Priorität nach Eingangsreihenfolge. Dadurch können dringende Nachrichten vorgezogen werden.
Blockierend und nicht blockierend
Standardmäßig blockiert mq_send, wenn die Warteschlange voll ist, und mq_receive, wenn sie leer ist. Öffnen Sie sie mit O_NONBLOCK, damit diese Aufrufe stattdessen EAGAIN zurückgeben, ohne zu warten.
Operationen mit Zeitlimit
mq_timedsend und mq_timedreceive akzeptieren eine absolute Frist und schlagen mit ETIMEDOUT fehl, wenn der Vorgang nicht rechtzeitig abgeschlossen werden kann. So vermeiden Sie endloses Warten.
Bereinigung
Schließen Sie den Deskriptor mit mq_close und entfernen Sie die benannte Warteschlange mit mq_unlink aus dem System, damit sie nicht bestehen bleibt, nachdem alle Benutzer fertig sind.
#include <mqueue.h>
void cleanup(mqd_t q, const char *name) {
mq_close(q);
mq_unlink(name); /* remove the named queue */
}Schnelltest
Testen Sie Ihr Verständnis von Nachrichtenwarteschlangen.
Zusammenfassung
Sie haben POSIX-Nachrichtenwarteschlangen kennengelernt.
- Einzelne Nachrichten statt roher Bytes austauschen
mq_open,mq_send,mq_receive- Die Zustellung erfolgt nach Priorität, dann nach Eingangsreihenfolge
- Optionale nicht blockierende und zeitgesteuerte Varianten; mit mq_close und mq_unlink aufräumen
Häufig gestellte Fragen
Ist die Lektion „Message Queues“ kostenlos?
Ja — der vollständige Text von „Message Queues“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Message Queues“?
Strukturierte Nachrichtenübermittlung Du übst C Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C Academy zu starten?
Keine Vorkenntnisse erforderlich. C Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Message Queues“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C Academy-Lektion Code schreiben und ausführen?
Ja. Jede C Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Pipes
- Shared Memory
- Message Queues
- Signale