C Programmeren

POSIX-berichtenwachtrijen met C-programmering

POSIX-berichtenwachtrijen met C-programmering

POSIX communicatie tussen processen (IPC)

IPC wordt gebruikt voor realtime extensies. Deze berichtenwachtrijen maken deel uit van Linux. Deze oproepen worden nu als standaard gebruikt, maar kunnen deel uitmaken van hedendaagse versies. Deze oproepen zijn eenvoudig te implementeren met een veel schonere interface.

POSIX-berichtenwachtrijen in Linux

V-berichtenwachtrijen in een Linux-systeem worden geïdentificeerd met behulp van sleutels die zijn verkregen met behulp van ftok belt. Deze POSIX-berichtenwachtrijen gebruiken meestal naamreeksen. In Linux-systemen worden POSIX-wachtrijen strings genoemd. Deze tekenreeksen worden geacht te beginnen met / en vervolgens andere tekens te hebben.  Processen die volgen en de naam van de wachtrijnaam met de juiste rechten kennen, kunnen berichten van en naar de wachtrij verzenden of ontvangen. Dit zal helpen bij het uitvoeren van belangrijke functionaliteiten.

Wat zijn POSIX-berichtenwachtrijoproepen??

POSIX-berichtenwachtrijen moeten worden gekoppeld aan elke bibliotheek die echt wordt afgesloten. Hieronder volgen enkele oproepen die worden gebruikt:

librt gebruikt de compileroptie -lrt

Oproepnamen beginnen met de mq_prefix

De details van Wachtrijoproepen worden hieronder besproken:

>> mq_open, mq_close

Deze functie wordt gebruikt om een ​​POSIX-wachtrij te openen.

Mq_open is een functie die wordt gebruikt om de naam van de wachtrij aan te roepen. De volgende parameter is een vlag die wordt gebruikt om de berichten te ontvangen. O_WRONLY wordt gebruikt om berichten te verzenden en O_RDWR wordt gebruikt om bewerkingen binnen de wachtrij te verzenden en te ontvangen. Gebruikers kunnen de vlag O_NONBLOCK gebruiken om de wachtrij op te geven in de niet-blokkerende modus en mode mq_send en mq_receive om gegevens in een wachtrij te verzenden en te ontvangen.

Syntaxis
De syntaxis voor de bovenstaande wachtrij-oproep wordt hieronder weergegeven:

#include
/* gebruikt om de bestanden te openen */
#include
/* om een ​​bestand te bepalen op basis van het pad */
#include
/* om beschrijvingen van berichtenwachtrijen op te nemen */
mqd_t mq_open (const karakter *naam, int oflag);
/* om de wachtrij te openen en te openen */
mqd_t mq_open (const character *name, int oflag, mode_t mode,
struct mq_attribuut *attribuut);

Mq_Vlaggen: Kan O of niet-blok zijn

Mq_MaxMsg: Maximaal aantal berichten dat in de wachtrij kan worden ingevoerd

Mq_Msgsize: Maximaal aantal bytes in een bericht

Mq_CurMsgs: Momenteel verzonden berichten in een wachtrij

mq_close calls: Om alle wachtrijbeschrijvingen te sluiten.

mq_notify

Het is een oproep die wordt gebruikt om een ​​aankomstmelding te registreren en af ​​te melden wanneer een bericht in een lege wachtrij komt.

Syntaxis

#include
/* om alle beschrijvingen van de berichtenwachtrij uit de code op te nemen */
int mq_notify (mqd_t mqdes, const struct sigevent *sevp);
/* om de aankomst van het bericht in een wachtrij te melden */

mq_unlink

Het wordt gebruikt om de wachtrij met wachtrijnaam . te verwijderen.

Syntaxis

int mq_unlink(const char *wachtrijnaam);
/* Om de wachtrij met naam als wachtrijnaam */ te verwijderen

mq_getattr, mq_setattr

Deze functie heeft een attribuutstructuur:

struct mq_attr wordt gebruikt als een berichtenwachtrij voor descriptors.

mq_setattr wordt gebruikt voor het instellen van de attributen in een wachtrij.

Syntaxis

#include
int mq_getattribute(mqd_t mqdes, struct mq_attribuut *attribuut);
int mq_setattribute(mqd_t mqdes, const struct mq_attribuut *newattribuut,
struct mq_attribute*oldattr);

Voorbeeld: Client-Server Communicatie via POSIX

Het volgende is een voorbeeld van het uitvoeren van client-servercommunicatie via POSIX-berichtenwachtrijen:. In het voorbeeld hebben we een clientbestand en een serverbestand.

We zullen twee bestanden hebben: het eerste (server)bestand is server.c, en het andere (klant)bestand is cliënt.c.

Servercode

De onderstaande afbeelding toont de code die we hebben gebruikt voor client-servercommunicatie. Eerst hebben we enkele bibliotheken aangeroepen om de tekenreeksen, variabelen en functies te definiëren. Vervolgens hebben we de we gedefinieerd fcntl functie en de naam van de wachtrijserver. Daarna hebben we de naam van de serverwachtrij gedefinieerd, gevolgd door de berichtgrootte en buffergrootte, om de grootte van berichten te definiëren die tegelijk in onze buffer passen. Vervolgens hebben we de wachtrijen gebeld en beschreven, waarna we de volgende tokens hebben gegenereerd om de reactie van de klant te zien zodra deze naar de klant is verzonden. Ten slotte werd de bevestiging voltooid door het bericht vanaf de server af te drukken. In het volgende gedeelte ziet u de vlaggen die in het eerdere gedeelte zijn besproken.

We hebben alle vlaggen geïnitialiseerd, inclusief: mq_flags, mq_maxmsgs, enz. om door te gaan met het opslaan van verzoeken. Vervolgens hebben we de voorwaarde toegepast op de naam van de server en de berichten opgeslagen in de wachtrijbuffer. Hierna hebben we er op het moment van opslag voor gezorgd dat de wachtrijen een prioriteitsregel volgden op basis van wie het eerst komt. Aan het einde geeft de code een foutbericht weer als er fouten zijn ontvangen van de client-end. Ten slotte hebben we de server verlaten om het verzoek naar de client te sturen.

Bewaar de server.c bestand

Klantcode

We zullen nu het tweede bestand bespreken. De onderstaande afbeelding is de code die we hebben gebruikt voor de client-servercommunicatie. De code begon met het aanroepen van standaardbibliotheken en het definiëren van variabele headers. Vervolgens hebben we de tekenreeksen en alle soorten gegevens gedefinieerd. Daarna hebben we de kop van de wachtrij gedeclareerd om de naam van de serverwachtrij te definiëren. Vervolgens hebben we de machtigingswachtrijen en berichtgrootte binnen de wachtrij gedefinieerd, samen met de grootte van de berichtenbuffer (de maximale grootte die in de wachtrij zou kunnen passen).

We zullen de wachtrijen beschrijven en een nieuwe client maken om de berichten te ontvangen die vanaf het einde van de server zijn verzonden. Vervolgens zullen we de vlaggen aanroepen en ze initialiseren, en de client-end-functie aanroepen. Het zal de functie verlaten in het geval van een fout. De waarde wordt in de buffer opgeslagen en er wordt een verzoekantwoord naar de server gestuurd. In het geval van een reactie, zal de server het token verstrekken, dat wordt afgedrukt zodra de client de invoer heeft ingevoerd. In het geval van een fout, zal het de foutwaarden retourneren, i.e., de client heeft geen bericht naar de server kunnen verzenden. Daarna zullen we de klant verlaten.

Bewaar de klant.c bestand

De bestanden uitvoeren

We gebruiken een gcc compiler om de bestanden uit te voeren. Om het server-eindbestand uit te voeren, typt u de toegevoegde opdracht in het terminalvenster:

$ sudo gcc-server.c -lrt

Typ vervolgens het volgende:

$ ./een.uit

De uitvoer zal er als volgt uitzien:

Ga naar de clientreactie en typ het volgende:

$ sudo gcc-client.c -lrt

Voer vervolgens het volgende uit:

$ ./een.uit

De uitvoer zal er als volgt uitzien:

Conclusie

In dit artikel heb je geleerd hoe je POSIX-berichtenwachtrijen kunt verzenden met C-programmering, evenals enkele van zijn functies. Vervolgens zag je enkele voorbeelden van dit proces in meer detail.

Gratis en open source game-engines voor het ontwikkelen van Linux-games
Dit artikel behandelt een lijst met gratis en open source game-engines die kunnen worden gebruikt voor het ontwikkelen van 2D- en 3D-games op Linux. E...
Shadow of the Tomb Raider voor Linux-zelfstudie
Shadow of the Tomb Raider is de twaalfde toevoeging aan de Tomb Raider-serie - een actie-avonturengame-franchise gemaakt door Eidos Montreal. De game ...
Hoe FPS te verhogen in Linux?
FPS staat voor Beelden per seconde. De taak van FPS is om de framesnelheid te meten bij het afspelen van video's of speluitvoeringen. In eenvoudige wo...