C Programmeren

POSIX gedeeld geheugen met C-programmering

POSIX gedeeld geheugen met C-programmering
POSIX gedeeld geheugen is een raamwerk voor communicatie tussen processen (IPC) gespecificeerd in de POSIX-specificaties. Twee (of meer) taken kunnen ervan lezen en naar de gedeelde geheugenzone schrijven terwijl het gedeelde geheugen tot stand wordt gebracht. POSIX gedeeld geheugen dwingt niet altijd kopieerbetalingen af, in tegenstelling tot andere IPC-structuren (e.g., pijp, contactdoos, enz.), en is wenselijk voor bepaalde programma's.

POSIX Gedeeld Geheugen Oproepen

De POSIX gedeelde geheugenfuncties waren gericht op het UNIX-concept dat het object een document moet zijn bij het uitvoeren van invoer-/uitvoeractiviteiten op een entiteit. Daarom, omdat u reciteert en inschrijft op een wederzijdse POSIX-geheugenentiteit, moet deze laatste worden beschouwd als een document. Een aan het geheugen toegewezen document is een POSIX-gedeelde geheugenentiteit. Om de . te gebruiken shm_open systeemoproepfunctie hieronder: /dev/shm, afzonderlijke documenten met gedeeld geheugen worden gegenereerd. Er zijn slechts twee speciale systeemaanroepen met gedeeld geheugen van POSIX, shm_open, en shm_unlink, die nauw verband houden met het openen en ontkoppelen van bestandssysteemaanroepen. De ftruncate, mmap, en munmap framework-oproepen voor documenten worden gebruikt om andere taken op het gedeelde POSIX-geheugen uit te voeren. Het is noodzakelijk om verbinding te maken met een programma dat gebruikmaakt van POSIX-aanroepen in gedeeld geheugen om: -lrt.

Programma's die gebruikmaken van POSIX-aanroepen met gedeeld geheugen, moeten de volgende stappen doorlopen:

Gebruik makend van shm_open(), een gedeeld geheugenobject vormen form. De documentdescriptor kan worden teruggedraaid als de vorming van het object succesvol is.

Met ftruncate(), de grootte van het object zal worden vastgesteld.

Met kaart() en MAP_SHARED, omlijn dit object in de huidige adresruimte.

Het gedeelde geheugen lezen/schrijven.

Via munmap(), het gedeelde geheugen ongedaan maken.

Gebruik dichtbij() om het object te sluiten.

Door shm_unlink(), verwijder het object in het gedeelde geheugen.

shm_open()

Zoals hierboven beschreven, shm_open() wordt gebruikt om een ​​nieuw gemeenschappelijk geheugenobject te genereren. Het maakt het object toegankelijk voor de aanroepende procedure met behulp van de teruggekeerde descriptor. Het volgende is de definitie van deze functieaanroep:

>> Int shm_open( const char *naam, int oflag, mode_t modus);

De eerste parameter is de naam van het gemeenschappelijke geheugenobject. Het is een null-terminated string van de /naam type, met de voorwaarde dat geen enkel ander teken een schuine streep kan zijn, behalve het eerste teken. Oflag is een kleine sluier gemaakt met een aantal van de voorgaande vlaggen door OR-ing, hetzij via O_RDONLY of O_RDWR. De beschreven parameters geven aan dat het object met gedeeld geheugen moet worden gevormd (O_CREAT) wanneer het nog niet bestaat en dat het object ook beschikbaar is voor lezen en schrijven (O_RDWR). Het allerlaatste argument stelt de directory-goedkeuringen in voor het object met gedeeld geheugen.

shm_unlink()

Shm_unlink() elimineert de POSIX gedeelde geheugenentiteit die eerder werd ontwikkeldformerly. De integer-documentdescriptor voor het object met gedeeld geheugen wordt geretourneerd via een effectieve aanroep naar shm_open(). Zoals gedefinieerd onder de shm_open(), de parameternaam is de titel van de gemeenschappelijke geheugenentiteit. Het volgende is de definitie van de shm_unlink() functie:

>> Int shm_unlink( const char *naam);

ftruncate()

Bij het instellen van het object, ftruncate() methode wordt afgestoten om de entiteitsgrootte in bytes in te stellen. De functiedefinitie is als volgt:

>> Int ftruncate (int fd, off_t lengte);

Bij het bouwen van een gedeeld POSIX-geheugen is de capaciteit inderdaad nul bytes. U kunt de POSIX shared memory-entiteit renderen met bytes met een groottelengte via ftruncate. Ftruncate levert nul op bij uitvoering. Ftruncate uitgangen -1 in geval van storing en foutje is ingesteld om de fout te activeren.

mmap()

Uiteindelijk wordt een in het geheugen toegewezen document met de entiteit met gedeeld geheugen ingesteld via de mmap() methode. Vervolgens levert het een aan het geheugen toegewezen documentaanwijzer op die wordt verwijderd om de entiteit met gedeeld geheugen te bereiken. Het volgende is de definitie van de mmap() functie:

>> Void *mmap ( void *addr, size_t lengte, int prot, int vlaggen, int fd, off_t offset);

Hierin is 'addr' het adres waaraan het wordt toegewezen. De 'lengte' is het bereik van de gedeelde geheugenentiteit. De waarden voor prot kunnen verschillen, maar we gebruiken de PROT READ | BETROUWBAAR SCHRIJVEN. Er zijn verschillende vlaggen, maar MAP SHARED is essentieel voor gedeeld geheugen. Nu is 'fd' een documentdescriptor die eerder is verkregen. Offset is het punt waar de mapping begint in de gedeelde geheugenentiteit; de 0-offsetwaarde kan ook worden gebruikt. Ter afronding, mmap() geeft de aanwijzer naar de afbeeldingspositie van de gedeelde geheugenentiteit.

munmap()

Op de positie aangegeven door addr en het krijgen van maat, lengte, munmap koppelt het gedeelde geheugenitem los memory. Munmap levert 0 op bij voltooiing en -1 in de situatie van onnauwkeurigheid, in welk geval errno wordt toegewezen om de fout te activeren.

>> Void munmap ( void *addr, size_t lengte);

Voorbeeld: zender en ontvanger Receive

Laten we het voorbeeld nemen van de zender en de ontvanger. De afzender maakt een nieuw object met gedeeld geheugen aan met de naam /shmem-voorbeeld en schrijf er drie cijfers doorheen in het gedeelde geheugen. Nu kan de ontvanger het object uit het gedeelde geheugen blootleggen en de drie cijfers uit het geheugen reciteren. We zullen drie bestanden maken met de namen protocol.h, afzender.c, en ontvanger.c.

$ aanraakprotocol.h
$ raak afzender aan.c
$ raak ontvanger aan.c

Vervolgens zullen we de onderstaande broncode toevoegen aan de bestanden 'protocol'.h,"afzender.c,' en 'ontvanger'.c.' Nu zullen we ze allemaal opslaan en sluiten.

Nu zullen we de bovenstaande code compileren en samenvoegen met het trefwoord -lrt afzonderlijk voor de afzender.c en ontvanger.c bestand. Hier is de opdracht om dit te doen:

$ gcc -o afzender afzender.c -lrt
$ gcc -o ontvanger ontvanger.c -lrt

Nu zullen we de afzendercode uitvoeren met de volgende opdracht:. De uitvoer wordt hieronder gegeven:.

$ ./afzender

Als de afzendercode wordt uitgevoerd, is het gedeelde geheugenobject gegenereerd en kan het hieronder worden gevonden: /dev/shm met behulp van de onderstaande opdracht:

$ ls -l /dev/shm | grep shmem-voorbeeld

Wanneer we de ontvangercode uitvoeren, krijgen we de onderstaande uitvoer:

$ ./ontvanger

Wanneer de functie: gm_unlink() wordt aangeroepen met het bestand 'receiver'.c,' het object /dev/shm/shmem-voorbeeld zal worden losgemaakt. In dit geval krijgt u geen object op de uitgang, zoals hieronder weergegeven:.

$ ls -l /dev/shm/shmem-voorbeeld

Conclusie

In dit artikel hebt u geleerd hoe u POSIX Shared Memory kunt gebruiken met C-programmering in Ubuntu 20.04, inclusief elke functieaanroep die wordt gebruikt om gedeeld geheugen tot stand te brengen. Ik hoop dat dit artikel je heeft geholpen om je programmeerkennis te verbeteren en alle twijfels over dit onderwerp heeft weggenomen.

Hoe Xdotool te gebruiken om muisklikken en toetsaanslagen in Linux te stimuleren
Xdotool is een gratis en open source opdrachtregelprogramma voor het simuleren van muisklikken en toetsaanslagen. Dit artikel behandelt een korte hand...
Top 5 ergonomische computermuisproducten voor Linux
Veroorzaakt langdurig computergebruik pijn in uw pols of vingers?? Heb je last van stijve gewrichten en moet je constant de hand schudden?? Voelt u ee...
Hoe de muis- en touchpad-instellingen te wijzigen met Xinput in Linux
De meeste Linux-distributies worden standaard geleverd met de bibliotheek "libinput" om invoergebeurtenissen op een systeem af te handelen. Het kan in...