Colas de mensajes
Mensajería estructurada
Colas de mensajes es una lección gratuita de C Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C Academy incluye 4 lecciones en total.
Mensajería estructurada
Una cola de mensajes permite que los procesos intercambien mensajes discretos en lugar de un flujo de bytes sin estructura. El kernel conserva los límites de los mensajes, por lo que cada envío se convierte exactamente en una recepción.
Mensajes frente a flujos
Las tuberías entregan un flujo de bytes cuyos límites se difuminan. Las colas de mensajes entregan unidades completas:
- Cada
sendes un mensaje - Cada
receivedevuelve un mensaje - Los mensajes pueden tener prioridades
Colas POSIX frente a System V
Existen dos API:
- POSIX:
mq_open,mq_send,mq_receive, con nombres que comienzan por una barra - System V:
msgget,msgsnd,msgrcv, basada en claves y con mensajes tipados
POSIX es la opción moderna y más clara.
Abrir una cola
mq_open crea o abre una cola con nombre y devuelve un descriptor. Puede pasar atributos como el número máximo de mensajes y su tamaño.
#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 */
}Atributos de la cola
struct mq_attr define mq_maxmsg (capacidad) y mq_msgsize (número máximo de bytes por mensaje). El búfer del receptor debe tener como mínimo 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;
}Enviar un mensaje
mq_send coloca un mensaje en la cola con una prioridad. Los mensajes con mayor prioridad se entregan primero.
#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 */
}Recibir un mensaje
mq_receive devuelve el mensaje con mayor prioridad. El búfer debe tener como mínimo mq_msgsize o la llamada falla 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);
}Las prioridades ordenan la entrega
A diferencia de una tubería FIFO, una cola de mensajes entrega primero por prioridad y, dentro de la misma prioridad, por orden de llegada. Esto permite que los mensajes urgentes se adelanten.
Bloqueante frente a no bloqueante
De forma predeterminada, mq_send se bloquea cuando la cola está llena y mq_receive se bloquea cuando está vacía. Ábrala con O_NONBLOCK para que devuelvan EAGAIN en lugar de esperar.
Operaciones temporizadas
mq_timedsend y mq_timedreceive aceptan un plazo absoluto y fallan con ETIMEDOUT si la operación no puede completarse a tiempo. Así se evita esperar indefinidamente.
Limpieza
Cierre el descriptor con mq_close y elimine la cola con nombre del sistema mediante mq_unlink para que no permanezca después de que todos los usuarios hayan terminado.
#include <mqueue.h>
void cleanup(mqd_t q, const char *name) {
mq_close(q);
mq_unlink(name); /* remove the named queue */
}Comprobación rápida
Compruebe su comprensión de las colas de mensajes.
Resumen
Ha aprendido a utilizar las colas de mensajes POSIX.
- Intercambie mensajes discretos, no bytes sin estructura
mq_open,mq_send,mq_receive- La entrega se realiza por prioridad y, después, por orden de llegada
- Existen variantes opcionales no bloqueantes y temporizadas; limpie los recursos con mq_close y mq_unlink
Preguntas frecuentes
¿La lección «Colas de mensajes» es gratis?
Sí — el texto completo de «Colas de mensajes» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C Academy, actualiza a CoddyKit PRO. El curso de C Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Colas de mensajes»?
Mensajería estructurada Practicas C Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C Academy?
No se requiere experiencia previa. C Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Colas de mensajes»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C Academy?
Sí. Cada lección de C Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Tuberías
- Memoria compartida
- Colas de mensajes
- Señales