Posix delt minne med C -programmering

Posix delt minne med C -programmering
POSIX delt minne er et rammeverk for interprosess kommunikasjon (IPC) spesifisert i POSIX-spesifikasjonene. To (eller flere) oppgaver kan lese fra det og skrive til den delte minnesonen mens du etablerer det delte minnet. Posix delt minne håndhever ikke alltid kopiering av kopier, i motsetning til andre IPC -strukturer (e.g., rør, stikkontakt osv.), og er ønskelig for visse programmer.

Posix delte minnesamtaler

POSIX delte minnefunksjoner fokusert på UNIX -konseptet om at objektet må være et dokument når du utfører input/output -aktiviteter på en enhet. Derfor, fordi du resiterer og skrevet på en gjensidig POSIX -minneenhet, må sistnevnte betraktes som et dokument. Et minne-kartlagt dokument er en POSIX delt minneenhet. Å bruke shm_open Systemanropsfunksjon under /dev/shm, Separate delte minnedokumenter genereres. Det er bare to dedikerte delte minnesystemanrop fra POSIX, shm_open, og shm_unlink, som er nært knyttet til åpnings- og koblingsfilsystemanrop. De ftruncate, mmap, og Munmap Framework anrop for dokumenter brukes til å utføre andre oppgaver på POSIX delt minne. Det er nødvendig å koble til et program som bruker POSIX delte minnesamtaler til -LRT.

Programmer som bruker POSIX delte minnesamtaler må gå gjennom følgende trinn:

Ved hjelp av shm_open (), danne et delt minneobjekt. Dokumentbeskrivelsen kan tilbakeføres hvis dannelsen av objektet er vellykket.

Med ftruncate (), Størrelsen på objektet vil bli løst.

Med kart() og Map_shared, avgrense dette objektet i det nåværende adresseområdet.

Les/skriv det delte minnet.

Via Munmap (), un-delineate det delte minnet.

Bruk Lukk() For å stenge objektet.

Gjennom shm_unlink (), Slett objektet i det delte minnet.

shm_open ()

Som beskrevet ovenfor, shm_open () brukes til å generere et nytt delt minneobjekt. Det gjør objektet tilgjengelig for anropsprosedyren ved hjelp av den tilbakestilte beskrivelsen. Følgende er definisjonen av denne funksjonssamtalen:

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

Den første parameteren er navnet på det delte minneobjektet. Det er en null-avsluttet streng av /Navn type, med bestemmelsen om at ingen annen karakter kan være en annen skråstrek enn den første karakteren. Oflag er et lite slør skapt med flere av de foregående flaggene ved å eller-ing, enten det er via O_rdonly eller O_rdwr. De beskrevne parametrene indikerer at dets delte minneobjekt må dannes (O_Creat) når det ikke allerede eksisterer, og også objektet er tilgjengelig for lesing og skriving (O_RDWR). Det aller siste argumentet setter katalogens godkjenninger for det delte minneobjektet.

shm_unlink ()

Shm_unlink () eliminerer POSIX delte minneenhet som tidligere ble utviklet. Heltallsdokumentbeskrivelsen for det delte minnet gjentas via en effektiv samtale til shm_open (). Som definert under shm_open (), Parameternavnet er tittelen på den delte minneenheten. Følgende er definisjonen av shm_unlink () funksjon:

>> int shm_unlink (const char *name);

ftruncate ()

Når du setter objektet, er ftruncate () Metoden støpes av for å sette opp enhetsstørrelsen i byte. Funksjonsdefinisjonen er som følger:

>> int ftruncate (int fd, off_t lengde);

Når du konstruerer et delt posix -minne, er det faktisk null byte i størrelseskapasitet. Du kan gjengi Posix delte minneenhet med byte med størrelseslengde via ftruncate. Ftruncate gir null ved utførelse. Ftruncate utganger -1 i tilfelle feil og errno er satt til å utløse feilen.

MMAP ()

Etter hvert settes et minne-kartlagt dokument med den delte minnetheten via MMAP () metode. Deretter gir den en minnekartlagt dokumentpeker som blir kastet av for å nå en enhet med delt minne. Følgende er definisjonen av MMAP () funksjon:

>> void *mmap (void *addr, størrelse_t lengde, int prot, int flagg, int fd, off_t offset);

I dette er 'addr' adressen den vil bli kartlagt. 'Lengden' er området for den delte minneenheten. Verdiene for prot kan variere, men vi vil bruke prot -lesen | Prot skrive. Det er flere flagg, men kartdelt er viktig for delt minne. Nå er 'FD' en dokumentbeskrivelse som ble oppnådd tidligere. Offset er poenget der kartleggingen begynner i den delte minneenheten; 0 forskyvningsverdien kan også brukes. Etter ferdigstillelse, MMAP () gir pekeren til kartleggingsposisjonen til den delte minneenheten.

Munmap ()

På stillingen regissert av addr og få størrelse, lengde, Munmap Fjern det delte minneelementet. Munmap gir 0 etter fullføring og -1 i situasjonen med unøyaktighet, i hvilket tilfelle errno tildeles for å utløse feilen.

>> ugyldig munmap (void *addr, størrelse_t lengde);

Eksempel: avsender og mottaker

La oss ta eksemplet med avsenderen og mottakeren. Avsenderen vil opprette et nytt objekt med delt minne med navnet /Shmem-Example og skriv inn tre tall i det delte minnet gjennom det. Nå kan mottakeren avsløre det delte minnet og resitere de tre tallene fra minnet. Vi oppretter tre filer med navnene protokoll.H, avsender.c, og mottaker.c.

$ berøringsprotokoll.h
$ Touch avsender.c
$ berøringsmottaker.c

Deretter vil vi legge til kildekoden nedenfor i filenes protokoll.H, "avsender.C, 'og' mottaker.c.'Nå vil vi redde alle og lukke dem.

Nå skal vi sammenstille og bli med i koden ovenfor ved å bruke nøkkelordet -LRT separat for avsenderen.C og mottaker.C -fil. Her er kommandoen om å gjøre det:

$ gcc -o avsender avsender.C -LRT
$ gcc -o mottakermottaker.C -LRT

Nå kjører vi avsenderkoden ved hjelp av følgende kommando. Utgangen er gitt nedenfor.

$ ./avsender

Kjører avsenderkoden, det delte minneobjektet er generert og kan bli funnet under /dev/shm Bruke kommandoen nedenfor:

$ ls -l /dev /shm | Grep Shmem-Example

Når vi kjører mottakerkoden, får vi utgangen nedenfor:

$ ./mottaker

Når funksjonen gm_unlink () kalles ved hjelp av filen 'mottaker.C, 'objektet /dev/shm/shmem-eksempler vil være løsrevet. I dette tilfellet vil du ikke oppnå noe objekt på utgangen, som vist nedenfor.

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

Konklusjon

I denne artikkelen lærte du hvordan du bruker POSIX delt minne med C -programmering i Ubuntu 20.04, inkludert alle funksjonssamtaler som brukes til å etablere delt minne. Jeg håper at denne artikkelen hjalp deg med å forbedre din programmeringskunnskap og dekket enhver tvil du har om dette emnet.