0Pricing
C Academy · Lezione

Code di messaggi

Messaggistica strutturata

Code di messaggi è una lezione C Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C Academy include 4 lezioni in totale.

Messaggistica strutturata

Una coda di messaggi consente ai processi di scambiarsi messaggi distinti anziché un flusso grezzo di byte. Il kernel preserva i confini dei messaggi, quindi ogni invio corrisponde esattamente a una ricezione.

Messaggi e flussi

Le pipe forniscono un flusso di byte in cui i confini si confondono. Le code di messaggi forniscono unità complete:

  • Ogni send corrisponde a un messaggio
  • Ogni receive restituisce un messaggio
  • I messaggi possono avere una priorità

Code POSIX e System V

Esistono due API:

  • POSIX: mq_open, mq_send, mq_receive, con nome preceduto da una barra
  • System V: msgget, msgsnd, msgrcv, basata su chiavi e con messaggi tipizzati

POSIX è la scelta più pulita e moderna.

Aprire una coda

mq_open crea o apre una coda con nome e restituisce un descrittore. È possibile passare attributi come il numero massimo di messaggi e le dimensioni massime.

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

Attributi della coda

struct mq_attr definisce mq_maxmsg (capacità) e mq_msgsize (numero massimo di byte per messaggio). Il buffer del ricevitore deve avere dimensioni almeno pari a 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;
}

Inviare un messaggio

mq_send inserisce un messaggio nella coda con una priorità. I messaggi con priorità più alta vengono consegnati per primi.

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

Ricevere un messaggio

mq_receive restituisce il messaggio con la priorità più alta. Il buffer deve avere dimensioni almeno pari a mq_msgsize, altrimenti la chiamata fallisce con 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);
}

Le priorità stabiliscono l'ordine di consegna

A differenza di una pipe FIFO, una coda di messaggi consegna i messaggi prima in base alla priorità, poi in ordine di arrivo all'interno della stessa priorità. In questo modo i messaggi urgenti possono passare avanti.

Bloccante e non bloccante

Per impostazione predefinita, mq_send si blocca quando la coda è piena e mq_receive si blocca quando è vuota. Apra la coda con O_NONBLOCK per fare in modo che restituiscano EAGAIN invece di attendere.

Operazioni con timeout

mq_timedsend e mq_timedreceive accettano una scadenza assoluta e falliscono con ETIMEDOUT se l'operazione non può completarsi in tempo. In questo modo si evita di attendere per sempre.

Pulizia

Chiuda il descrittore con mq_close e rimuova la coda con nome dal sistema con mq_unlink, così non rimarrà dopo che tutti gli utenti avranno terminato.

#include <mqueue.h>

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

Verifica rapida

Verifichi la Sua comprensione delle code di messaggi.

Riepilogo

Ha imparato a utilizzare le code di messaggi POSIX.

  • Scambi messaggi distinti, non byte grezzi
  • mq_open, mq_send, mq_receive
  • La consegna avviene in base alla priorità, poi all'ordine di arrivo
  • Varianti non bloccanti e con timeout opzionali; esegua la pulizia con mq_close e mq_unlink

Domande Frequenti

La lezione «Code di messaggi» è gratuita?

Sì — il testo completo di «Code di messaggi» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C Academy, passa a CoddyKit PRO. Il corso C Academy include 4 lezioni in totale.

Cosa imparerò in «Code di messaggi»?

Messaggistica strutturata Eserciti C Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C Academy?

Non è richiesta alcuna esperienza precedente. C Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Code di messaggi»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C Academy?

Sì. Ogni lezione C Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Pipe
  2. Memoria condivisa
  3. Code di messaggi
  4. Segnali
← Torna a C Academy