0Pricing
C Academy · Lektion

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 send entspricht einer Nachricht
  • Jeder receive gibt 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

  1. Pipes
  2. Shared Memory
  3. Message Queues
  4. Signale
← Zurück zu C Academy