C Програмування

Черги повідомлень POSIX із програмуванням на C

Черги повідомлень POSIX із програмуванням на C

Міжпроцесний зв’язок POSIX (IPC)

IPC використовується для розширень у режимі реального часу. Ці черги повідомлень є частиною Linux. Зараз ці дзвінки використовуються як стандарт, але можуть бути частиною сучасних версій. Ці виклики легко реалізувати з набагато чистішим інтерфейсом.

Черги повідомлень POSIX у Linux

V черги повідомлень у системі Linux визначаються за допомогою ключів, отриманих за допомогою ftok дзвінки. Ці черги повідомлень 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 (символ const * ім'я, int oflag);
/ * для відкриття та доступу до черги * /
mqd_t mq_open (символ const * ім'я, int oflag, mode_t mode,
struct mq_attribute * 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

Він використовується для видалення черги, що має ім'я_череди.

Синтаксис

int mq_unlink (const char * queue_name);
/ * Видалення черги, що має ім’я queue_name * /

mq_getattr, mq_setattr

Ця функція має структуру атрибутів:

struct mq_attr використовується як черга повідомлень для дескрипторів.

mq_setattr використовується для встановлення атрибутів всередині черги.

Синтаксис

#включати
int mq_getattribute (mqd_t mqdes, struct mq_attribute * attribute);
int mq_setattribute (mqd_t mqdes, const struct mq_attribute * newattribute,
struct mq_attribute * oldattr);

Приклад: Зв'язок клієнт-сервер через POSIX

Далі наведено приклад здійснення зв'язку клієнт-сервер через черги повідомлень POSIX. У цьому прикладі ми матимемо файл клієнта та файл сервера.

У нас буде два файли: перший (серверний) файл сервер.c, а інший (клієнтський) файл - клієнт.c.

Код сервера

Зображення, відображене нижче, показує код, який ми використовували для зв'язку клієнт-сервер. Спочатку ми викликали деякі бібліотеки для визначення рядків, змінних та функцій. Потім ми визначили fcntl функція та ім'я сервера черги. Після цього ми визначили назву черги сервера, а потім її розмір повідомлення та розмір буфера, щоб визначити розмір повідомлень відповідно до нашого буфера. Далі ми зателефонували та описали черги, а потім створили наступні маркери, щоб побачити відповідь клієнта, коли вона була надіслана клієнту. Нарешті, підтвердження було завершено, надрукувавши повідомлення з кінця сервера. У наступному розділі ви побачите прапори, про які йшлося в попередньому розділі.

Ми ініціалізували всі прапори, включаючи mq_ прапори, mq_maxmsgs, тощо. щоб продовжити зберігання запитів. Потім ми застосували умову до імені сервера і зберегли повідомлення в буфері черги. Після цього, під час зберігання, ми забезпечили, щоб черги дотримувались правила пріоритету на основі черговості. В кінці код відображає повідомлення про помилку, якщо є помилки, отримані від клієнтського кінця. Нарешті, ми вийшли з сервера, щоб відправити запит клієнту.

Збережіть сервер.c файл

Код клієнта

Зараз ми обговоримо другий файл. Наведене нижче зображення - це код, який ми використовували для зв'язку клієнт-сервер. Код починався із виклику стандартних бібліотек та визначення заголовків змінних. Потім ми визначили рядки та всі типи даних. Після цього ми оголосили заголовок черги, щоб визначити ім'я черги сервера. Далі ми визначили черги дозволів та розмір повідомлення всередині черги, а також розмір буфера повідомлень (максимальний розмір, який міг поміститися всередині черги).

Ми опишемо черги та створимо нового клієнта для отримання повідомлень, надісланих з кінця сервера. Потім ми будемо викликати прапори та ініціалізувати їх, а також викликати функцію закінчення клієнта. Він вийде з функції у випадку помилки. Значення зберігається всередині буфера, а відповідь на запит надсилається на сервер. У разі відповіді сервер надає маркер, який друкується після того, як кінцевий клієнт введе вхідні дані. У разі помилки він поверне значення помилки, тобто.e., клієнт не зміг надіслати повідомлення на сервер. Після цього ми вийдемо з клієнта.

Збережіть клієнта.c файл

Виконання файлів

Ми використовуємо a gcc компілятор для виконання файлів. Щоб запустити кінцевий файл сервера, введіть додану команду у вікні терміналу:

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

Далі введіть наступне:

$ ./ а.назовні

Результат буде виглядати наступним чином:

Переходячи до відповіді клієнта, введіть наступне:

$ sudo gcc клієнт.c -lrt

Потім виконайте наступне:

$ ./ а.назовні

Результат буде виглядати наступним чином:

Висновок

У цій статті ви дізналися, як надсилати черги повідомлень POSIX із програмуванням на С, а також деякі його функції. Потім ви побачили кілька прикладів цього процесу більш докладно.

Vulkan for Linux Users
With each new generation of graphics cards, we see game developers push the limits of graphical fidelity and come one step closer to photorealism. But...
OpenTTD vs Simutrans
Creating your own transport simulation can be fun, relaxing and extremely enticing. That's why you need to make sure that you try out as many games as...
OpenTTD Tutorial
OpenTTD is one of the most popular business simulation games out there. In this game, you need to create a wonderful transportation business. However,...