Очереди сообщений
Структурированный обмен сообщениями
«Очереди сообщений» — бесплатный урок C Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C Academy содержит 4 уроков всего.
Структурированный обмен сообщениями
Очередь сообщений позволяет процессам обмениваться отдельными сообщениями, а не необработанным потоком байтов. Ядро сохраняет границы сообщений, поэтому каждой отправке соответствует ровно одно получение.
Сообщения и потоки
Каналы передают поток байтов, в котором границы размыты. Очереди сообщений передают целые единицы:
- каждый вызов
sendотправляет одно сообщение - каждый вызов
receiveвозвращает одно сообщение - сообщения можно расставлять по приоритету
Очереди POSIX и System V
Существуют два API:
- POSIX:
mq_open,mq_send,mq_receive, имя начинается с косой черты - System V:
msgget,msgsnd,msgrcv, интерфейс на основе ключей с типизированными сообщениями
POSIX — более удобный современный вариант.
Открытие очереди
mq_open создаёт или открывает именованную очередь и возвращает дескриптор. Можно передать такие атрибуты, как максимальное число сообщений и их размер.
#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 */
}Атрибуты очереди
struct mq_attr задаёт mq_maxmsg (ёмкость) и mq_msgsize (максимальное число байтов в сообщении). Буфер получателя должен быть не меньше 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;
}Отправка сообщения
mq_send помещает сообщение в очередь с указанным приоритетом. Сначала доставляются сообщения с более высоким приоритетом.
#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 */
}Получение сообщения
mq_receive возвращает сообщение с наивысшим приоритетом. Размер буфера должен быть не меньше mq_msgsize, иначе вызов завершается ошибкой 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);
}Приоритет определяет порядок доставки
В отличие от канала FIFO, очередь сообщений доставляет сообщения сначала по приоритету, а затем по порядку поступления в рамках одного приоритета. Благодаря этому срочные сообщения могут опережать остальные.
Блокирующий и неблокирующий режимы
По умолчанию mq_send блокируется, когда очередь заполнена, а mq_receive — когда она пуста. Откройте очередь с O_NONBLOCK, чтобы вместо ожидания эти вызовы возвращали EAGAIN.
Операции с ограничением времени
mq_timedsend и mq_timedreceive принимают абсолютный крайний срок и завершаются ошибкой ETIMEDOUT, если операция не может выполниться вовремя. Это предотвращает бесконечное ожидание.
Освобождение ресурсов
Закройте дескриптор с помощью mq_close, а затем удалите именованную очередь из системы с помощью mq_unlink, чтобы она не сохранялась после завершения работы всех пользователей.
#include <mqueue.h>
void cleanup(mqd_t q, const char *name) {
mq_close(q);
mq_unlink(name); /* remove the named queue */
}Быстрая проверка
Проверьте, насколько хорошо Вы понимаете работу очередей сообщений.
Повторение
Вы изучили очереди сообщений POSIX.
- Обменивайтесь отдельными сообщениями, а не необработанными байтами
mq_open,mq_send,mq_receive- Доставка выполняется по приоритету, а затем по порядку поступления
- Доступны неблокирующие операции и варианты с ограничением времени; освобождайте ресурсы с помощью mq_close и mq_unlink
Часто задаваемые вопросы
Урок «Очереди сообщений» бесплатный?
Да — полный текст урока «Очереди сообщений» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C Academy, подпишись на CoddyKit PRO. Курс C Academy содержит 4 уроков всего.
Чему я научусь в уроке «Очереди сообщений»?
Структурированный обмен сообщениями Ты практикуешь C Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C Academy?
Предыдущий опыт не требуется. C Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Очереди сообщений»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C Academy?
Да. Каждый урок C Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Каналы
- Разделяемая память
- Очереди сообщений
- Сигналы