C Programmering

POSIX-meddelandeköer med C-programmering

POSIX-meddelandeköer med C-programmering

POSIX Inter-process Communication (IPC)

IPC används för realtidsförlängningar. Dessa meddelandeköer är en del av Linux. Dessa samtal används som standard nu men kan vara en del av samtida versioner. Dessa samtal är enkla att implementera med ett mycket renare gränssnitt.

POSIX-meddelandeköer i Linux

V-meddelandeköer i ett Linux-system identifieras med hjälp av nycklar som erhålls med ftok samtal. Dessa POSIX-meddelandeköer använder vanligtvis namnsträngar. I Linux-system kallas POSIX-köer strängar. Dessa strängar anses börja med / och sedan ha andra tecken.  Processer som följer och känner till namnet på könamnet med lämpliga rättigheter kan skicka eller ta emot meddelanden till och från kön. Detta hjälper till att utföra viktiga funktioner.

Vad är POSIX-meddelandekösamtal?

POSIX-meddelandeköer måste länka till alla bibliotek som går ut på riktigt. Nedan följer några samtal som används:

librt använder kompileringsalternativet -lrt

Samtalsnamn börjar med mq_prefix

Detaljerna i kösamtal diskuteras nedan:

>> mq_open, mq_close

Denna funktion används för att öppna en POSIX-kö.

Mq_open är en funktion som används för att anropa kön. Nästa parameter är en flagga som används för att ta emot meddelandena. O_WRONLY används för att skicka meddelanden och O_RDWR används för att skicka och ta emot operationer i kön. Användare kan använda O_NONBLOCK-flaggan för att ange kön till det icke-blockerande läget och mq_send och mq_receive för att skicka och ta emot data i en kö.

Syntax
Syntaksen för ovanstående köanrop visas nedan:

#omfatta
/ * används för att öppna filerna * /
#omfatta
/ * för att bestämma en fil baserat på sökvägen * /
#omfatta
/ * för att inkludera meddelandeköbeskrivningar * /
mqd_t mq_open (const tecken * namn, int oflag);
/ * för att öppna och komma åt kön * /
mqd_t mq_open (const tecken * namn, int oflag, mode_t läge,
struct mq_attribute * attribut);

Mq_Flags: Kan vara O eller icke-block

Mq_MaxMsg: Maximalt antal meddelanden som kan matas in i kön

Mq_Msgsize: Maximalt antal byte i ett meddelande

Mq_CurMsgs: För närvarande skickade meddelanden i en kö

mq_close samtal: För att stänga alla köbeskrivare.

mq_notify

Det är ett samtal som används för att registrera och avregistrera ankomstmeddelande när ett meddelande går in i en tom kö.

Syntax

#omfatta
/ * för att inkludera alla meddelandeköbeskrivningar från koden * /
int mq_notify (mqd_t mqdes, const struct sigevent * sevp);
/ * för att meddela ankomsten av meddelandet i en kö * /

mq_unlink

Den används för att ta bort kön med könamn.

Syntax

int mq_unlink (const char * queue_name);
/ * Ta bort kön med namn som könamn * /

mq_getattr, mq_setattr

Denna funktion har en attributstruktur:

struct mq_attr används som en meddelandekö för deskriptorer.

mq_setattr används för att ställa in attributen i en kö.

Syntax

#omfatta
int mq_getattribute (mqd_t mqdes, struct mq_attribute * attribut);
int mq_setattribute (mqd_t mqdes, const struct mq_attribute * newattribute,
struct mq_attribute * oldattr);

Exempel: Klient-serverkommunikation via POSIX

Följande är ett exempel på att utföra klient-server-kommunikation via POSIX-meddelandeköer. I exemplet kommer vi att ha en klientfil och serverfil.

Vi kommer att ha två filer: den första (server) filen är server.c, och den andra (klient) filen är klient.c.

Serverkod

Bilden som visas nedan visar koden som vi använde för klient-server-kommunikation. Först ringde vi några bibliotek för att definiera strängar, variabler och funktioner. Sedan definierade vi fcntl funktion och namnet på köservern. Därefter definierade vi namnet på serverkön, följt av dess meddelandestorlek och buffertstorlek, för att definiera storleken på meddelanden som passar vår buffert i taget. Därefter ringde vi och beskrev köerna, sedan genererade vi nästa tokens för att se klientsvaret när det skickades till klienten. Slutligen slutfördes bekräftelsen genom att skriva ut meddelandet från serveränden. I nästa avsnitt kommer du att se flaggorna som diskuterades i det tidigare avsnittet.

Vi initialiserade alla flaggor, inklusive mq_flags, mq_maxmsgs, etc. för att fortsätta med lagring av förfrågningar. Sedan tillämpade vi villkoret på namnet på servern och lagrade meddelandena i köbufferten. Efter detta, vid tidpunkten för lagring, såg vi till att köerna följde en princip för först till kvarn-prioritet. I slutet visar koden ett felmeddelande om det uppstår fel från klientänden. Slutligen lämnade vi servern för att skicka begäran till klienten.

Spara servern.c-fil

Kundkod

Vi kommer nu att diskutera den andra filen. Bilden som visas nedan är koden vi använde för klient-server-kommunikationen. Koden började med att anropa standardbibliotek och definiera variabla rubriker. Sedan definierade vi strängarna och alla typer av data. Efter det förklarade vi rubriken för kön för att definiera serverköns namn. Därefter definierade vi behörighetsköerna och meddelandestorleken i kön, tillsammans med storleken på meddelandebufferten (den maximala storleken som kunde passa in i kön).

Vi kommer att beskriva köerna och skapa en ny klient för att ta emot meddelanden som skickas från slutet av servern. Sedan kommer vi att ringa flaggorna och initialisera dem och ringa till klient-slut-funktionen. Funktionen avslutas i händelse av ett fel. Värdet lagras inuti bufferten och ett begärandesvar skickas till servern. I händelse av ett svar kommer servern att tillhandahålla token, som skrivs ut när klientänden har angett inmatningen. I händelse av ett fel returnerar det felvärdena, dvs.e., klienten har inte kunnat skicka ett meddelande till servern. Därefter lämnar vi klienten.

Spara klienten.c-fil

Köra filerna

Vi använder en gcc kompilator för att köra filerna. För att köra serverns slutfil, skriv det bifogade kommandot i terminalfönstret:

$ sudo gcc-server.c-lrt

Skriv sedan följande:

$ ./ a.ut

Utgången visas enligt följande:

Gå till klientsvaret och skriv följande:

$ sudo gcc-klient.c-lrt

Kör sedan följande:

$ ./ a.ut

Utgången visas enligt följande:

Slutsats

I den här artikeln lärde du dig att skicka POSIX-meddelandeköer med C-programmering, liksom några av dess funktioner. Sedan såg du några exempel på denna process mer detaljerat.

Mus Så här ändrar du muspekare och markörstorlek, färg och schema på Windows 10
Så här ändrar du muspekare och markörstorlek, färg och schema på Windows 10
Muspekaren och markören i Windows 10 är mycket viktiga aspekter av operativsystemet. Detta kan också sägas för andra operativsystem, så i sanning är d...
Gratis och öppen källkodsmotorer för utveckling av Linux-spel
Den här artikeln kommer att täcka en lista över gratis motorer med öppen källkod som kan användas för att utveckla 2D- och 3D-spel på Linux. Det finns...
Shadow of the Tomb Raider for Linux Tutorial
Shadow of the Tomb Raider är det tolfte tillskottet till Tomb Raider-serien - en action-äventyrsspelfranchise skapad av Eidos Montreal. Spelet mottogs...