Filas de mensagens
Mensagens estruturadas.
Filas de mensagens é uma aula grátis de C Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C Academy inclui 4 aulas no total.
Mensagens estruturadas
Uma fila de mensagens permite que os processos troquem mensagens discretas em vez de um fluxo bruto de bytes. O kernel preserva os limites das mensagens, portanto cada envio se torna exatamente uma recepção.
Mensagens versus fluxos
Pipes fornecem um fluxo de bytes cujos limites se confundem. Filas de mensagens fornecem unidades completas:
- Cada
sendé uma mensagem - Cada
receiveretorna uma mensagem - As mensagens podem ter prioridades
Filas POSIX versus System V
Existem duas APIs:
- POSIX:
mq_open,mq_send,mq_receive, com nomes iniciados por uma barra - System V:
msgget,msgsnd,msgrcv, baseada em chaves e com mensagens tipadas
POSIX é a opção mais limpa e moderna.
Abrindo uma fila
mq_open cria ou abre uma fila nomeada e retorna um descritor. Você pode passar atributos como a quantidade máxima de mensagens e o tamanho máximo delas.
#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 da fila
struct mq_attr define mq_maxmsg (capacidade) e mq_msgsize (quantidade máxima de bytes por mensagem). O buffer do receptor deve ter pelo menos 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;
}Enviando uma mensagem
mq_send coloca uma mensagem na fila com uma prioridade. As mensagens de maior prioridade são entregues primeiro.
#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 */
}Recebendo uma mensagem
mq_receive retorna a mensagem de maior prioridade. O buffer deve ter pelo menos mq_msgsize ou a chamada falhará com 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);
}As prioridades determinam a ordem de entrega
Ao contrário de um pipe FIFO, uma fila de mensagens entrega primeiro por prioridade e, dentro da mesma prioridade, pela ordem de chegada. Isso permite que mensagens urgentes passem à frente.
Bloqueante versus não bloqueante
Por padrão, mq_send bloqueia quando a fila está cheia e mq_receive bloqueia quando ela está vazia. Abra com O_NONBLOCK para fazer essas operações retornarem EAGAIN em vez de esperar.
Operações temporizadas
mq_timedsend e mq_timedreceive aceitam um prazo absoluto e falham com ETIMEDOUT se a operação não puder ser concluída a tempo. Isso evita esperar indefinidamente.
Limpeza
Feche o descritor com mq_close e remova a fila nomeada do sistema com mq_unlink, para que ela não persista depois que todos os usuários terminarem.
#include <mqueue.h>
void cleanup(mqd_t q, const char *name) {
mq_close(q);
mq_unlink(name); /* remove the named queue */
}Verificação rápida
Teste sua compreensão sobre filas de mensagens.
Recapitulação
Você aprendeu sobre filas de mensagens POSIX.
- Troque mensagens discretas, não bytes brutos
mq_open,mq_send,mq_receive- A entrega ocorre por prioridade e, depois, por ordem de chegada
- Há variantes opcionais não bloqueantes e temporizadas; faça a limpeza com mq_close e mq_unlink
Perguntas Frequentes
A aula “Filas de mensagens” é grátis?
Sim — o texto completo de “Filas de mensagens” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C Academy, atualize para CoddyKit PRO. O curso de C Academy inclui 4 aulas no total.
O que vou aprender em “Filas de mensagens”?
Mensagens estruturadas. Você pratica C Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C Academy?
Nenhuma experiência prévia é necessária. C Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Filas de mensagens”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C Academy?
Sim. Cada aula de C Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Pipes
- Memória compartilhada
- Filas de mensagens
- Sinais