Programowanie C

Kolejki wiadomości POSIX z programowaniem w C

Kolejki wiadomości POSIX z programowaniem w C

Komunikacja międzyprocesowa POSIX (IPC)

IPC jest używany do rozszerzeń w czasie rzeczywistym. Te kolejki wiadomości są częścią Linuksa. Te połączenia są obecnie używane jako standard, ale mogą być częścią współczesnych wersji. Te wywołania są łatwe do wdrożenia dzięki znacznie czystszemu interfejsowi.

Kolejki wiadomości POSIX w systemie Linux

V kolejki komunikatów w systemie Linux są identyfikowane za pomocą kluczy, które uzyskuje się za pomocą ftok dzwoni. Te kolejki komunikatów POSIX zwykle używają ciągów nazw. W systemach Linux kolejki POSIX nazywane są stringami. Uważa się, że te ciągi zaczynają się od /, a następnie mają inne znaki.  Procesy, które następują i znają nazwę kolejki z odpowiednimi uprawnieniami, mogą wysyłać lub odbierać komunikaty do i z kolejki. Pomoże to w wykonaniu ważnych funkcjonalności.

Co to są wywołania kolejki wiadomości POSIX?

Kolejki komunikatów POSIX muszą łączyć się z dowolną biblioteką, która naprawdę wychodzi. Oto kilka połączeń, które są używane:

librt używa opcji kompilatora -lrt

Nazwy połączeń zaczynają się od mq_prefix

Szczegóły wywołań kolejki omówiono poniżej:

>> mq_otwórz, mq_zamknij

Ta funkcja służy do otwierania kolejki POSIX.

Mq_open to funkcja, która służy do wywołania nazwy kolejki. Następnym parametrem jest flaga używana do odbierania wiadomości. O_WRONLY służy do wysyłania wiadomości, a O_RDWR służy do wysyłania i odbierania operacji w kolejce. Użytkownicy mogą użyć flagi O_NONBLOCK, aby określić kolejkę w trybie nieblokującym i mq_send i mq_receive wysyłać i odbierać dane w kolejce.

Składnia
Składnia powyższego wywołania kolejki jest wyświetlana poniżej:

#zawierać
/* używane do otwierania plików */
#zawierać
/* określenie pliku na podstawie ścieżki */
#zawierać
/* aby dołączyć opisy kolejek komunikatów */
mqd_t mq_open (stały znak *nazwa, int oflag);
/* otwarcie i dostęp do kolejki */
mqd_t mq_open (stały znak *nazwa, int oflag, tryb_t tryb,
struct mq_attribute *atrybut);

Mq_Flagi: Może być O lub nieblokowy

Mq_MaxMsg: Maksymalna liczba wiadomości, które można wprowadzić do kolejki

Mq_Msgsize: Maksymalna liczba bajtów w wiadomości

Mq_CurMsgs: Aktualnie wysłane wiadomości w kolejce

mq_zamknij połączenia: Aby zamknąć wszystkie deskryptory kolejki.

mq_notify

Jest to połączenie używane do rejestracji i wyrejestrowania powiadomienia o przybyciu, gdy wiadomość znajdzie się w pustej kolejce.

Składnia

#zawierać
/* aby dołączyć wszystkie opisy kolejek komunikatów z kodu */
int mq_notify (mqd_t mqdes, const struct sigevent *sevp);
/* powiadomienie o przybyciu wiadomości w kolejce */

mq_unlink

Służy do usuwania kolejki o nazwie nazwa_kolejki.

Składnia

int mq_unlink(const char *nazwa_kolejki);
/* Aby usunąć kolejkę o nazwie nazwa_kolejki */

mq_getattr, mq_setattr

Ta funkcja ma strukturę atrybutów:

struct mq_attr jest używana jako kolejka komunikatów dla deskryptorów.

mq_setattr służy do ustawiania atrybutów wewnątrz kolejki.

Składnia

#zawierać
int mq_getattribute(mqd_t mqdes, struct mq_attribute *atrybut);
int mq_setattribute(mqd_t mqdes, const struct mq_attribute *newattribute,
struct mq_attribute*oldattr);

Przykład: Komunikacja klient-serwer przez POSIX

Poniżej znajduje się przykład wykonywania komunikacji klient-serwer za pośrednictwem kolejek komunikatów POSIX. W tym przykładzie będziemy mieli plik klienta i plik serwera.

Będziemy mieć dwa pliki: pierwszy (serwer) to serwer.do, a drugi plik (klienta) to klient.do.

Kod serwera

Poniższy obrazek pokazuje kod, którego użyliśmy do komunikacji klient-serwer. Najpierw wywołaliśmy kilka bibliotek, aby zdefiniować ciągi, zmienne i funkcje. Następnie zdefiniowaliśmy fcntl funkcja i nazwa serwera kolejki. Następnie zdefiniowaliśmy nazwę kolejki serwera, a następnie jej rozmiar wiadomości i rozmiar bufora, aby zdefiniować rozmiar wiadomości, aby zmieściły się w naszym buforze na raz. Następnie wywołaliśmy i opisaliśmy kolejki, następnie wygenerowaliśmy kolejne tokeny, aby zobaczyć odpowiedź klienta po jej wysłaniu do klienta. Ostatecznie potwierdzenie zostało zakończone poprzez wydrukowanie wiadomości z końca serwera. W następnej sekcji zobaczysz flagi omówione we wcześniejszej sekcji.

Zainicjowaliśmy wszystkie flagi, w tym mq_flagi, mq_maxmsgs, itp. kontynuować przechowywanie żądań. Następnie zastosowaliśmy warunek do nazwy serwera i zapisaliśmy wiadomości w buforze kolejki. Następnie, w momencie przechowywania, upewniliśmy się, że kolejki są zgodne z zasadą pierwszeństwa według kolejności zgłoszeń. Na koniec kod wyświetla komunikat o niepowodzeniu, jeśli pojawią się jakieś błędy odebrane od strony klienta. W końcu opuściliśmy serwer, aby wysłać żądanie do klienta.

Zapisz serwer.plik c

Kod klienta

Omówimy teraz drugi plik. Obraz wyświetlany poniżej to kod, którego użyliśmy do komunikacji klient-serwer. Kod rozpoczął się od wywołania standardowych bibliotek i zdefiniowania nagłówków zmiennych. Następnie zdefiniowaliśmy ciągi i wszystkie typy danych. Następnie zadeklarowaliśmy nagłówek kolejki, aby zdefiniować nazwę kolejki serwera. Następnie zdefiniowaliśmy kolejki uprawnień i rozmiar wiadomości w kolejce, wraz z rozmiarem bufora wiadomości (maksymalny rozmiar, który może zmieścić się w kolejce).

Opiszemy kolejki i stworzymy nowego klienta do odbierania wiadomości wysyłanych z końca serwera. Następnie wywołamy flagi i zainicjujemy je oraz wywołamy funkcję client-end. Wyjdzie z funkcji w przypadku błędu. Wartość jest przechowywana w buforze, a odpowiedź na żądanie jest wysyłana do serwera. W przypadku odpowiedzi serwer dostarczy token, który jest drukowany po wejściu klienta do danych wejściowych. W przypadku błędu zwróci wartości błędów, i.mi., klient nie mógł wysłać wiadomości na serwer to. Następnie wyjdziemy z klienta.

Zapisz klienta.plik c

Wykonywanie plików

Używamy gcc kompilator do uruchamiania plików. Aby uruchomić plik końcowy serwera, wpisz dołączoną komendę w oknie terminala:

$ sudo serwer gcc.c -lrt

Następnie wpisz następujące polecenie:

$ ./za.na zewnątrz

Dane wyjściowe będą wyglądać następująco:

Przechodząc do odpowiedzi klienta, wpisz następujące polecenie:

$ sudo klient gcc.c -lrt

Następnie uruchom następujące czynności:

$ ./za.na zewnątrz

Dane wyjściowe będą wyglądać następująco:

Wniosek

W tym artykule dowiedziałeś się, jak wysyłać kolejki wiadomości POSIX za pomocą programowania w C, a także niektóre z jego funkcji. Następnie zapoznałeś się z kilkoma przykładami tego procesu bardziej szczegółowo.

Gry Battle for Wesnoth Tutorial
Battle for Wesnoth Tutorial
The Battle for Wesnoth is one of the most popular open source strategy games that you can play at this time. Not only has this game been in developmen...
Gry 0 A.D. Tutorial
0 A.D. Tutorial
Out of the many strategy games out there, 0 A.D. manages to stand out as a comprehensive title and a very deep, tactical game despite being open sourc...
Gry Unity3D Tutorial
Unity3D Tutorial
Introduction to Unity 3D Unity 3D is a powerful game development engine. It is cross platform that is it allows you to create games for mobile, web, d...