0Pricing
C Academy · Урок

Очереди сообщений

Структурированный обмен сообщениями

«Очереди сообщений» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Каналы
  2. Разделяемая память
  3. Очереди сообщений
  4. Сигналы
← Назад к C Academy