C Academy · Lektion

Message queues

Struktureret messaging

Lektion 3 af 413 trin

Message queues er en gratis C Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C Academy-kurset indeholder 4 lektioner i alt.

Struktureret meddelelsesudveksling

En meddelelseskø lader processer udveksle enkelte meddelelser i stedet for en rå bytestrøm. Kernen bevarer meddelelsesgrænserne, så hver sendning bliver til præcis én modtagelse.

Meddelelser over for strømme

Pipes leverer en bytestrøm, hvor grænserne udviskes. Meddelelseskøer leverer hele enheder:

  • Hver send er én meddelelse
  • Hver receive returnerer én meddelelse
  • Meddelelser kan prioriteres

POSIX over for System V-køer

Der findes to API'er:

  • POSIX: mq_open, mq_send, mq_receive, navngivet med en skråstreg
  • System V: msgget, msgsnd, msgrcv, nøglebaseret med typede meddelelser

POSIX er det renere og moderne valg.

Åbning af en kø

mq_open opretter eller åbner en navngiven kø og returnerer en deskriptor. Du kan angive attributter som maksimalt antal meddelelser og maksimal størrelse.

#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 */
}

Køattributter

struct mq_attr definerer mq_maxmsg (kapacitet) og mq_msgsize (maksimalt antal bytes pr. meddelelse). Modtagerens buffer skal mindst være mq_msgsize.

#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;
}

Afsendelse af en meddelelse

mq_send placerer en meddelelse i køen med en prioritet. Meddelelser med højere prioritet leveres først.

#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 */
}

Modtagelse af en meddelelse

mq_receive returnerer meddelelsen med den højeste prioritet. Bufferen skal mindst være mq_msgsize, ellers mislykkes kaldet med EMSGSIZE.

#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);
}

Prioriteter bestemmer leveringsrækkefølgen

I modsætning til et FIFO-pipe leverer en meddelelseskø først efter prioritet og derefter efter ankomstrækkefølge inden for samme prioritet. Det lader hastende meddelelser springe foran.

Blokerende over for ikke-blokerende

Som standard blokerer mq_send, når køen er fuld, og mq_receive blokerer, når den er tom. Åbn med O_NONBLOCK for at få disse kald til at returnere EAGAIN i stedet for at vente.

Tidsbegrænsede operationer

mq_timedsend og mq_timedreceive accepterer en absolut tidsfrist og mislykkes med ETIMEDOUT, hvis operationen ikke kan gennemføres i tide. Det forhindrer endeløs ventetid.

Ryd op

Luk deskriptoren med mq_close, og fjern den navngivne kø fra systemet med mq_unlink, så den ikke bliver liggende, efter alle brugere er færdige.

#include <mqueue.h>

void cleanup(mqd_t q, const char *name) {
    mq_close(q);
    mq_unlink(name); /* remove the named queue */
}

Hurtigt tjek

Test din forståelse af meddelelseskøer.

Opsummering

Du har lært om POSIX-meddelelseskøer.

  • Udveksl enkelte meddelelser, ikke rå bytes
  • mq_open, mq_send, mq_receive
  • Levering sker efter prioritet og derefter ankomstrækkefølge
  • Valgfrie ikke-blokerende og tidsbegrænsede varianter; ryd op med mq_close og mq_unlink
Gratis at komme i gang

Lær C med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
39
Lektioner
144

Ofte stillede spørgsmål

Er lektionen “Message queues” gratis?

Ja — hele teksten til “Message queues” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C Academy-kurset, skal du opgradere til CoddyKit PRO. C Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Message queues”?

Struktureret messaging Du øver dig i C Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C Academy?

Der kræves ingen tidligere erfaring. C Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Message queues”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C Academy-lektion?

Ja. Alle C Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Pipes
  2. Delt hukommelse
  3. Message queues
  4. Signaler
← Tilbage til C Academy