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
sendcorrisponde a un messaggio - Ogni
receiverestituisce 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
- Pipe
- Memoria condivisa
- Code di messaggi
- Segnali