Hvordan bruke MMAP -funksjon på C -språk?

Hvordan bruke MMAP -funksjon på C -språk?
De MMAP () Funksjon brukes til kartlegging mellom et prosessadresseom og enten filer eller enheter. Når en fil blir kartlagt til et prosessadresseom, kan du få tilgang til filen som en matrise i programmet. Dette er en av de mest effektive måtene å få tilgang til data i filen og gir et sømløst kodingsgrensesnitt som er naturlig for en datastruktur som kan vurderes uten at han abstraksjon av lesing og skriving fra filer. I denne artikkelen skal vi diskutere hvordan vi bruker MMAP () funksjon i Linux. Så la oss komme i gang.

Headerfil:

#inkludere

Syntaks:

void * mmap (void * adresse, størrelse_t lengde, int beskytte, int flagg, int -arkivering,
off_t offset)

Argumenter:

Funksjonen tar 6 argumenter:

adresse:

Dette argumentet gir en foretrukket startadresse for kartleggingen. Hvis en annen kartlegging ikke eksisterer der, vil kjernen velge en nærliggende sidegrense og opprette kartleggingen; Ellers velger kjernen en ny adresse. Hvis dette argumentet er null, kan kjernen plassere kartleggingen hvor som helst den ser passende.

lengde:

Dette er antall byte som skal kartlegges.

beskytte:

Dette argumentet brukes til å kontrollere hva slags tilgang som er tillatt. Dette argumentet kan være logisk 'eller' av følgende flagg Prot_read | Prot_write | Prot_exec | Prot_none. Tilgangstypene av lesing, skriv og utførelse er tillatelsene på innholdet.

flagg:

Dette argumentet brukes til å kontrollere kartet. Følgende er noen vanlige verdier av flaggene:

  • Map_shared: Dette flagget brukes til å dele kartleggingen med alle andre prosesser, som er kartlagt til dette objektet. Endringer i kartleggingsregionen vil bli skrevet tilbake til filen.
  • Map_private: Når dette flagget brukes, vil kartleggingen ikke bli sett av noen andre prosesser, og endringene som gjøres vil ikke bli skrevet til filen.
  • Map_anonymous / map_anon: Dette flagget brukes til å lage en anonym kartlegging. Anonym kartlegging betyr at kartleggingen ikke er koblet til noen filer. Denne kartleggingen brukes som den grunnleggende primitive for å utvide haugen.
  • Map_fixed: Når dette flagget brukes, må systemet tvinges til å bruke den nøyaktige kartleggingsadressen som er spesifisert i adresse Hvis dette ikke er mulig, vil kartleggingen mislykkes.

Filedes:

Dette er filbeskrivelsen som må kartlegges.

offset:

Dette er forskjøvet fra der filkartleggingen startet. Enkelt sagt kobles kartleggingen til (offset) til (Offset+lengde-1) byte for filen åpnes på Filedes Beskrivelse.

Returverdier:

Om suksess, den MMAP () Returnerer 0; For feil returnerer funksjonen map_failed.

Bildelig kan vi representere kartfunksjonen som følger:

For unmap det kartlagte området Munmap () Funksjon brukes:

Syntaks:

int munmap(tomrom *adresse, størrelse_t lengde);

Returverdier:

Om suksess, den Munmap () Returnerer 0; For feil returnerer funksjonen -1.

Eksempler:

Nå vil vi se et eksempelprogram for hvert av følgende ved hjelp av MMAP () Systemanrop:

  • Minnetildeling (eksempel1.c)
  • Lesefil (eksempel2.c)
  • Skrivefil (eksempel3.c)
  • Interprosess kommunikasjon (eksempel4.c)

Eksempel1.c

#inkludere
#inkludere
int main ()
int n = 5;
int *ptr = mmap (null, n *størrelse av (int),
Prot_read | Prot_write, map_private | Map_anonym, 0, 0);
if (ptr == map_failed)
printf ("kartlegging mislyktes \ n");
retur 1;

for (int i = 0; iptr [i] = i*10;
for (int i = 0; iprintf ("[%d]", ptr [i]);
printf ("\ n");
int err = munmap (ptr, 10*sizeof (int));
Hvis (feil != 0)
printf ("Unmapping mislyktes \ n");
retur 1;

retur 0;

I eksempel1.c Vi tildeler minne ved hjelp av MMAP. Her brukte vi Prot_read | Prot_write beskyttelse for lesing og skriving til det kartlagte området. Vi brukte map_private | Map_anonymt flagg. Map_private brukes fordi kartleggingsregionen ikke deles med andre prosesser, og map_anonymous brukes fordi her har vi ikke kartlagt noen fil. Av samme grunn, Filbeskrivelse og offset Verdien er satt til 0.

Eksempel2.c

#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
int main (int argc, char *argv [])
hvis (argc < 2)
printf ("Filbane som ikke er nevnt \ n");
Avslutt (0);

const char *filepath = argv [1];
int fd = åpen (filepath, o_rdonly);
if (fd < 0)
printf ("\ n \"%s \ ""kunne ikke åpne \ n"",
filepath)