Программирование на C

Очереди сообщений POSIX с программированием на C

Очереди сообщений POSIX с программированием на C

Межпроцессное взаимодействие POSIX (IPC)

IPC используется для расширений в реальном времени. Эти очереди сообщений являются частью Linux. Эти вызовы сейчас используются как стандарт, но могут быть частью современных версий. Эти вызовы легко реализовать с гораздо более понятным интерфейсом.

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

Очереди сообщений V в системе Linux идентифицируются с помощью ключей, полученных с помощью фток звонки. Эти очереди сообщений POSIX обычно используют строки имен. В системах Linux очереди POSIX называются строками. Считается, что эти строки начинаются с /, а затем содержат другие символы.  Процессы, которые следуют и знают имя очереди с соответствующими правами, могут отправлять или получать сообщения в очередь и из нее. Это поможет в выполнении важных функций.

Что такое вызовы очереди сообщений POSIX?

Очереди сообщений POSIX должны связываться с любой библиотекой, которая выходит из реальной. Ниже приведены несколько используемых вызовов:

librt использует параметр компилятора -lrt

Имена звонков начинаются с mq_prefix

Подробности вызовов очереди обсуждаются ниже:

>> mq_open, mq_close

Эта функция используется для открытия очереди POSIX.

Mq_open - это функция, которая используется для вызова имени очереди. Следующий параметр - это флаг, используемый для получения сообщений. O_WRONLY используется для отправки сообщений, а O_RDWR используется для отправки и получения операций в очереди. Пользователи могут использовать флаг O_NONBLOCK, чтобы указать очередь в неблокирующий режим и mq_send а также mq_receive отправлять и получать данные в очереди.

Синтаксис
Синтаксис для вышеуказанного вызова очереди показан ниже:

#включать
/ * используется для открытия файлов * /
#включать
/ * для определения файла по пути * /
#включать
/ * для включения описаний очереди сообщений * /
mqd_t mq_open (константный символ * имя, int oflag);
/ * открыть и получить доступ к очереди * /
mqd_t mq_open (константный символ * имя, int oflag, режим mode_t,
struct mq_attribute * атрибут);

Mq_Flags: Может быть O или неблокировать

Mq_MaxMsg: Максимальное количество сообщений, которые могут быть помещены в очередь

Mq_Msgsize: Максимальное количество байтов в сообщении

Mq_CurMsgs: Отправленные в данный момент сообщения в очереди

вызовы mq_close: Закрыть все дескрипторы очереди.

mq_notify

Это вызов, используемый для регистрации и отмены регистрации уведомления о прибытии, когда сообщение попадает в пустую очередь.

Синтаксис

#включать
/ * чтобы включить все описания очереди сообщений из кода * /
int mq_notify (mqd_t mqdes, const struct sigevent * sevp);
/ * для уведомления о прибытии сообщения в очередь * /

mq_unlink

Используется для удаления очереди с именем queue_name.

Синтаксис

int mq_unlink (const char * имя_ очереди);
/ * Чтобы удалить очередь с именем queue_name * /

mq_getattr, mq_setattr

Эта функция имеет структуру атрибутов:

struct mq_attr используется как очередь сообщений для дескрипторов.

mq_setattr используется для установки атрибутов внутри очереди.

Синтаксис

#включать
int mq_getattribute (mqd_t mqdes, struct mq_attribute * атрибут);
int mq_setattribute (mqd_t mqdes, const struct mq_attribute * новый атрибут,
struct mq_attribute * oldattr);

Пример: связь клиент-сервер через POSIX

Ниже приведен пример взаимодействия клиент-сервер через очереди сообщений POSIX. В примере у нас будет файл клиента и файл сервера.

У нас будет два файла: первый (серверный) файл сервер.c, а другой (клиентский) файл клиент.c.

Код сервера

На изображении ниже показан код, который мы использовали для взаимодействия клиент-сервер. Сначала мы вызвали некоторые библиотеки для определения строк, переменных и функций. Затем мы определили fcntl функция и имя сервера очереди. После этого мы определили имя очереди сервера, за которым следовали размер сообщения и размер буфера, чтобы определить размер сообщений, которые умещаются в нашем буфере за раз. Затем мы вызвали и описали очереди, затем мы сгенерировали следующие токены, чтобы увидеть ответ клиента после его отправки клиенту. Наконец, подтверждение было завершено печатью сообщения со стороны сервера. В следующем разделе вы увидите флаги, которые обсуждались в предыдущем разделе.

Мы инициализировали все флаги, включая mq_flags, mq_maxmsgs, так далее. продолжить хранение запросов. Затем мы применили условие к имени сервера и сохранили сообщения в буфере очереди. После этого, во время хранения, мы убедились, что очереди следуют правилу приоритета в порядке очереди. В конце код отображает сообщение об ошибке, если есть какие-либо ошибки, полученные со стороны клиента. Наконец, мы вышли из сервера, чтобы отправить запрос клиенту.

Сохраните сервер.c файл

Код клиента

Теперь обсудим второй файл. Изображение ниже - это код, который мы использовали для взаимодействия клиент-сервер. Код начался с вызова стандартных библиотек и определения заголовков переменных. Затем мы определили строки и все типы данных. После этого мы объявили заголовок очереди, чтобы определить имя очереди сервера. Затем мы определили очереди разрешений и размер сообщений внутри очереди, а также размер буфера сообщений (максимальный размер, который может поместиться внутри очереди).

Опишем очереди и создадим нового клиента для приема сообщений, отправленных с конца сервера. Затем мы вызовем флаги и инициализируем их, а также вызовем клиентскую функцию. Он выйдет из функции в случае ошибки. Значение хранится внутри буфера, и на сервер отправляется ответ на запрос. В случае ответа сервер затем предоставит токен, который будет распечатан после того, как клиентская сторона введет ввод. В случае ошибки он вернет значения ошибки, i.е., клиент не смог отправить сообщение на сервер. После этого выйдем из клиента.

Спасите клиента.c файл

Выполнение файлов

Мы используем gcc компилятор для выполнения файлов. Чтобы запустить файл на стороне сервера, введите добавленную команду в окне терминала:

$ sudo gcc сервер.c -lrt

Затем введите следующее:

$ ./ а.вне

Результат будет выглядеть следующим образом:

Переходя к ответу клиента, введите следующее:

$ sudo gcc клиент.c -lrt

Затем запустите следующее:

$ ./ а.вне

Результат будет выглядеть следующим образом:

Заключение

В этой статье вы узнали, как отправлять очереди сообщений POSIX с помощью программирования на C, а также некоторые из его функций. Затем вы познакомились с некоторыми примерами этого процесса более подробно.

SuperTuxKart для Linux
SuperTuxKart - отличная игра, созданная для того, чтобы бесплатно познакомить вас с Mario Kart в вашей системе Linux. Играть в нее довольно сложно и в...
Учебник Battle for Wesnoth
Битва за Веснот - одна из самых популярных стратегических игр с открытым исходным кодом, в которую вы можете играть сейчас. Эта игра не только очень д...
0 А.D. Руководство
Из множества существующих стратегических игр 0 A.D. удается выделиться как всеобъемлющее название и очень глубокая тактическая игра, несмотря на то, ч...