C Programmering

POSIX-delt hukommelse med C-programmering

POSIX-delt hukommelse med C-programmering
POSIX delt hukommelse er en ramme for inter-proces kommunikation (IPC) specificeret i POSIX specifikationerne. To (eller flere) opgaver kan læse fra det og skrive til den delte hukommelseszone, mens de opretter den delte hukommelse. POSIX delt hukommelse håndhæver ikke altid kopiudbetalinger i modsætning til andre IPC-strukturer (f.eks.g., rør, muffe osv.), og er ønskeligt for visse programmer.

POSIX delt hukommelsesopkald

POSIX-delte hukommelsesfunktioner fokuserede på UNIX-konceptet om, at objektet skal være et dokument, når der udføres input / output-aktiviteter på en enhed. Derfor, fordi du reciterer og indskriver til en gensidig POSIX-hukommelsesenhed, skal sidstnævnte betragtes som et dokument. Et hukommelseskortet dokument er en POSIX-delt hukommelsesenhed. At bruge shm_open systemopkaldsfunktion nedenunder / dev / shm, der genereres separate delte hukommelsesdokumenter. Der er kun to dedikerede systemopkald til delt hukommelse fra POSIX, shm_open, og shm_unlink, som er tæt knyttet til åbning og fjernelse af tilknytning af filsystemopkald. Det afkort, mmap, og kortlægge rammekald til dokumenter bruges til at udføre andre opgaver på POSIX delt hukommelse. Det er nødvendigt at forbinde et program, der bruger POSIX delt hukommelsesopkald til -lrt.

Programmer, der bruger POSIX delt hukommelsesopkald, skal gennemgå følgende trin:

Ved brug af shm_open (), danne et delt hukommelsesobjekt. Dokumentbeskrivelsen kan tilbageføres, hvis dannelsen af ​​objektet er vellykket.

Med afkort (), størrelsen på objektet vil blive rettet.

Med kort() og MAP_SHARED, afgrænse dette objekt i det nuværende adresserum.

Læs / skriv den delte hukommelse.

Via munmap (), fjerne afgrænsning af den delte hukommelse.

Brug tæt() at lukke objektet.

igennem shm_unlink (), slet objektet i den delte hukommelse.

shm_open ()

Som beskrevet ovenfor, shm_open () bruges til at generere et nyt delt hukommelsesobjekt. Det gør objektet tilgængeligt for opkaldsproceduren ved hjælp af den tilbageførte deskriptor. Følgende er definitionen af ​​dette funktionsopkald:

>> Int shm_open (const char * navn, int oflag, mode_t mode);

Den første parameter er navnet på det delte hukommelsesobjekt. Det er en null-termineret streng af /navn type med den betingelse, at ingen anden karakter kan være en skråstreg, bortset fra dens første karakter. Oflag er et lille slør oprettet med flere af de foregående flag af OR-ing, hvad enten det er via O_RDONLY eller O_RDWR. De beskrevne parametre indikerer, at dets delte hukommelsesobjekt skal dannes (O_CREAT), når det ikke allerede findes, og også objektet er tilgængeligt til læsning og skrivning (O_RDWR). Det sidste argument angiver kataloggodkendelser for det delte hukommelsesobjekt.

shm_unlink ()

Shm_unlink () eliminerer POSIX delt hukommelsesenhed, der tidligere blev udviklet. Heltalsdokumentbeskrivelsen for det delte hukommelsesobjekt returneres via et effektivt opkald til shm_open (). Som defineret under shm_open (), parameternavnet er titlen på den delte hukommelsesenhed. Følgende er definitionen af shm_unlink () fungere:

>> Int shm_unlink (const char * navn);

afkort ()

Efter indstilling af objektet, afkort () metoden er kastet af for at opsætte enhedsstørrelsen i byte. Funktionsdefinitionen er som følger:

>> Int ftruncate (int fd, off_t længde);

Når du konstruerer en delt POSIX-hukommelse, er den faktisk nul byte i størrelseskapacitet. Du kan gengive den delte POSIX-hukommelsesenhed med byte af størrelseslængde via afkort. Afkort giver nul ved udførelse. Afkort udgange -1 i tilfælde af en fejl og errno er indstillet til at udløse fejlen.

mmap ()

Til sidst indstilles et hukommelseskortet dokument med den delte hukommelsesenhed via mmap () metode. Derefter giver den en hukommelseskortet dokumentmarkør, der kastes for at nå den delte hukommelsesenhed. Følgende er definitionen af mmap () fungere:

>> Void * mmap (ugyldig * addr, størrelse_t længde, int prot, int flag, int fd, off_t offset);

I dette er 'addr' den adresse, som den skal kortlægges til. 'Længden' er området for den delte hukommelsesenhed. Værdierne for prot kan variere, men vi bruger PROT LÆS | PROT SKRIV. Der er flere flag, men MAP SHARED er afgørende for delt hukommelse. Nu er 'fd' en dokumentbeskrivelse, der blev opnået tidligere. Offset er det punkt, hvor kortlægningen begynder i den delte hukommelsesenhed; 0-forskydningsværdien kan også bruges. Efter afslutning, mmap () giver markøren til kortpositionen for den delte hukommelsesenhed.

munmap ()

På positionen instrueret af addr og få størrelse, længde, kortlægge ophæver det delte hukommelseselement. Munmap giver 0 ved afslutning og -1 i unøjagtighedssituationen, i hvilket tilfælde errno tildeles til at udløse fejlen.

>> Annulleret munmap (ugyldigt * addr, størrelse_t længde);

Eksempel: Afsender og modtager

Lad os tage eksemplet med afsenderen og modtageren. Afsenderen opretter et nyt objekt med delt hukommelse med navnet / shmem-eksempel og indskriv tre tal i den delte hukommelse gennem det. Nu kan modtageren udsætte det delte hukommelsesobjekt og recitere de tre tal fra hukommelsen. Vi opretter tre filer med navnene protokol.h, afsender.c, og modtager.c.

$ touch-protokol.h
$ touch afsender.c
$ touch-modtager.c

Dernæst vil vi tilføje nedenstående kildekode til filernes protokol.h, "afsender.c, 'og' modtager.c.'Nu gemmer vi alle og lukker dem.

Nu vil vi kompilere og sammenføje ovenstående kode ved hjælp af nøgleordet -lrt separat for afsenderen.c og modtager.c-fil. Her er kommandoen til at gøre det:

$ gcc -o afsender.c -lrt
$ gcc -o modtager modtager.c -lrt

Nu kører vi afsenderkoden ved hjælp af følgende kommando. Outputtet er angivet nedenfor.

$ ./ afsender

Når afsenderkoden køres, er det delte hukommelsesobjekt genereret og kan findes under / dev / shm ved hjælp af kommandoen nedenfor:

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

Når vi kører modtagerkoden, får vi output nedenfor:

$ ./modtager

Hver gang funktionen gm_unlink () kaldes ved hjælp af filen 'modtager.c, 'objektet / dev / shm / shmem-eksempel vil blive løsrevet. I dette tilfælde får du intet objekt på output, som vist nedenfor.

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

Konklusion

I denne artikel lærte du, hvordan du bruger POSIX Shared Memory med C-programmering i Ubuntu 20.04, inklusive hvert funktionsopkald, der bruges til at etablere delt hukommelse. Jeg håber, at denne artikel hjalp dig med at forbedre din programmeringskendskab og dækkede enhver tvivl, du har om dette emne.

Sådan vises OSD-overlay i fuldskærms Linux-apps og -spil
Afspilning af fuldskærmsspil eller brug af apps i distraktionsfri fuldskærmstilstand kan afskære dig fra relevante systemoplysninger, der er synlige i...
Top 5 spiloptagelseskort
Vi har alle set og elsket streaming af gameplay på YouTube. PewDiePie, Jakesepticye og Markiplier er kun nogle af de bedste spillere, der har tjent mi...
Sådan udvikler du et spil på Linux
For et årti siden ville ikke mange Linux-brugere forudsige, at deres foretrukne operativsystem en dag ville være en populær spilplatform til kommercie...