C Programmering

Hvordan bruke mmap-funksjon i C-språk?

Hvordan bruke mmap-funksjon i C-språk?
De mmap () funksjonen brukes til å kartlegge mellom et prosessadresseområde og enten filer eller enheter. Når en fil blir tilordnet et prosessadresseområde, 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 du bruker mmap () funksjon i Linux. Så la oss komme i gang.

Overskriftsfil:

#inkludere

Syntaks:

void * mmap (void * address, size_t length, int protect, int flags, int filedes,
off_t offset)

Argumenter:

Funksjonen tar 6 argumenter:

1. adresse:

Dette argumentet gir en foretrukket startadresse for kartleggingen. Hvis det ikke finnes en annen kartlegging der, vil kjernen velge en sidegrense i nærheten og opprette kartleggingen. Ellers velger kjernen en ny adresse. Hvis dette argumentet er NULL, kan kjernen plassere kartleggingen hvor som helst det passer.

2. lengde:

Dette er antall byte som skal tilordnes.

3. beskytte:

Dette argumentet brukes til å kontrollere hva slags tilgang som er tillatt. Dette argumentet kan være logisk 'ELLER' for følgende flagg PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE.  Tilgangstypene lese, skrive og utføre er tillatelsene til innholdet.

4. flagg:

Dette argumentet brukes til å kontrollere kartets natur. Følgende er noen vanlige verdier for flaggene:

  • MAP_SHARED: Dette flagget brukes til å dele kartleggingen med alle andre prosesser som er kartlagt til dette objektet. Endringer i kartområdet blir skrevet tilbake til filen.
  • MAP_PRIVATE: Når dette flagget brukes, vil ikke kartleggingen bli sett av andre prosesser, og endringene som blir gjort 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 grunnleggende primitiv for å utvide dyngen.
  • MAP_FIXED: Når dette flagget brukes, må systemet tvinges til å bruke den nøyaktige kartadressen som er angitt i adresse Hvis dette ikke er mulig, vil kartleggingen mislykkes.

5. arkiverer:

Dette er filbeskrivelsen som må kartlegges.

6. forskyvning:

Dette blir forskjøvet fra hvor filmappingen startet. Enkelt sagt kobles kartleggingen til (forskjøvet) til (forskyvning + lengde-1) byte for filen åpnes den arkiverer deskriptor.

Returverdier:

På suksess, den mmap () returnerer 0; for feil returnerer funksjonen MAP_FAILED.

Bildemessig kan vi representere kartfunksjonen som følger:

For å kartlegge det kartlagte området kartlegge () funksjonen brukes:

Syntaks:

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

Returverdier:

På suksess, den kartlegge () returnerer 0; for feil returnerer funksjonen -1.

Eksempler:

Nå vil vi se et eksempelprogram for hvert av de følgende ved hjelp av mmap () systemanrop:

  • Minnetildeling (eksempel 1.c)
  • Lesefil (eksempel 2.c)
  • Skrivefil (eksempel 3.c)
  • Interprosesskommunikasjon (Eksempel 4.c)

Eksempel 1.c

#inkludere
#inkludere
int main ()
int N = 5; // Antall elementer for matrisen
int * ptr = mmap (NULL, N * sizeof (int),
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS,
0, 0);
hvis (ptr == MAP_FAILED)
printf ("Kartlegging mislyktes \ n");
retur 1;

// Fyll elementene i matrisen
for (int i = 0; i ");
for (int i = 0; iprintf ("[% d]", ptr [i]);

printf ("\ n");
int err = munmap (ptr, 10 * sizeof (int));
hvis (feil != 0)
printf ("Kartleggingen mislyktes \ n");
retur 1;

retur 0;

I eksempel 1.c vi tildeler minne ved hjelp av mmap. Her brukte vi PROT_READ | PROT_WRITE-beskyttelse for lesing og skriving til den kartlagte regionen. Vi brukte MAP_PRIVATE | MAP_ANONYMOUS flagg. MAP_PRIVATE brukes fordi kartområdet ikke deles med andre prosesser, og MAP_ANONYMOUS brukes fordi her har vi ikke kartlagt noen fil. Av samme grunn er den filbeskrivelse og forskyvning verdien er satt til 0.

Eksempel 2.c

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

const char * filepath = argv [1];
int fd = åpen (filbane, O_RDONLY);
hvis (fd < 0)
printf ("\ n \"% s \ ""kunne ikke åpne \ n"",
filesti)
Mus Legg til musebevegelser i Windows 10 ved hjelp av disse gratisverktøyene
Legg til musebevegelser i Windows 10 ved hjelp av disse gratisverktøyene
De siste årene har datamaskiner og operativsystemer utviklet seg sterkt. Det var en tid da brukere måtte bruke kommandoer for å navigere gjennom filad...
Mus Kontroller og administrer musebevegelser mellom flere skjermer i Windows 10
Kontroller og administrer musebevegelser mellom flere skjermer i Windows 10
Dual Display Mouse Manager lar deg kontrollere og konfigurere musebevegelse mellom flere skjermer, ved å bremse bevegelsene nær grensen. Windows 10/8,...
Mus WinMouse lar deg tilpasse og forbedre musemarkørenes bevegelse på Windows PC
WinMouse lar deg tilpasse og forbedre musemarkørenes bevegelse på Windows PC
Hvis du vil forbedre standardfunksjonene til musepekeren, bruk freeware WinMouse. Det legger til flere funksjoner som hjelper deg å få mest mulig ut a...