C Programmering

Sådan bruges mmap-funktionen på C-sprog?

Sådan bruges mmap-funktionen på C-sprog?
Det mmap () funktion bruges til kortlægning mellem et procesadresseområde og enten filer eller enheder. Når en fil er tilknyttet et procesadresseområde, kan filen fås som en matrix i programmet. Dette er en af ​​de mest effektive måder at få adgang til data i filen og giver en problemfri kodningsgrænseflade, der er naturlig for en datastruktur, der kan vurderes, uden at han abstraktion af læsning og skrivning fra filer. I denne artikel skal vi diskutere, hvordan man bruger mmap () funktion i Linux. Så lad os komme i gang.

Overskriftsfil:

#omfatte

Syntaks:

ugyldig * mmap (ugyldig * adresse, størrelse_t længde, int beskytte, int flag, int arkiver,
off_t offset)

Argumenter:

Funktionen tager 6 argumenter:

1. adresse:

Dette argument giver en foretrukken startadresse til kortlægningen. Hvis der ikke findes en anden kortlægning der, vælger kernen en sidegrænse i nærheden og opretter kortlægningen. Ellers vælger kernen en ny adresse. Hvis dette argument er NULL, kan kernen placere kortlægningen hvor som helst, den finder passende.

2. længde:

Dette er antallet af bytes, der skal kortlægges.

3. beskytte:

Dette argument bruges til at kontrollere, hvilken type adgang der er tilladt. Dette argument kan være logisk 'ELLER' for de følgende flag PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE.  Adgangstyperne læse, skrive og udføre er tilladelserne til indholdet.

4. flag:

Dette argument bruges til at kontrollere kortets art. Følgende er nogle almindelige værdier for flagene:

  • MAP_SHARED: Dette flag bruges til at dele kortlægningen med alle andre processer, der er kortlagt til dette objekt. Ændringer foretaget i kortlægningsområdet vil blive skrevet tilbage til filen.
  • MAP_PRIVATE: Når dette flag bruges, kan kortlægningen ikke ses af andre processer, og de foretagne ændringer skrives ikke til filen.
  • MAP_ANONYMOUS / MAP_ANON: Dette flag bruges til at oprette en anonym kortlægning. Anonym kortlægning betyder, at kortlægningen ikke er forbundet til nogen filer. Denne kortlægning bruges som den grundlæggende primitive til at udvide bunken.
  • MAP_FIXED: Når dette flag bruges, skal systemet tvinges til at bruge den nøjagtige kortadresse, der er angivet i adresse Hvis dette ikke er muligt, mislykkes kortlægningen.

5. arkiverer:

Dette er filbeskrivelsen, der skal kortlægges.

6. forskydning:

Dette forskydes fra, hvor filtilknytningen startede. Kort sagt forbinder kortlægningen med (forskudt) til (offset + længde-1) bytes til filen åben den arkiverer deskriptor.

Returværdier:

På succes, den mmap () returnerer 0; for fejl returnerer funktionen MAP_FAILED.

Billedmæssigt kan vi repræsentere kortfunktionen som følger:

For at kortlægge det kortlagte område munmap () funktion bruges:

Syntaks:

int munmap(ugyldig *adresse, størrelse_t længde);

Returværdier:

På succes, den munmap () returnerer 0; for fejl returnerer funktionen -1.

Eksempler:

Nu ser vi et eksempelprogram for hvert af følgende ved hjælp af mmap () systemopkald:

  • Hukommelsestildeling (eksempel 1.c)
  • Læsefil (eksempel 2.c)
  • Skrivning af fil (eksempel 3.c)
  • Interprocess-kommunikation (eksempel 4.c)

Eksempel 1.c

#omfatte
#omfatte
int main ()
int N = 5; // Antal elementer til arrayet
int * ptr = mmap (NULL, N * størrelse af (int),
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS,
0, 0);
hvis (ptr == MAP_FAILED)
printf ("Kortlægning mislykkedes \ n");
returnere 1;

// Udfyld elementerne i arrayet
for (int i = 0; i ");
for (int i = 0; iprintf ("[% d]", ptr [i]);

printf ("\ n");
int err = munmap (ptr, 10 * sizeof (int));
hvis (fejler != 0)
printf ("Unmapping Failed \ n");
returnere 1;

returnere 0;

I eksempel 1.c vi tildeler hukommelse ved hjælp af mmap. Her brugte vi PROT_READ | PROT_WRITE-beskyttelse til læsning og skrivning til det kortlagte område. Vi brugte MAP_PRIVATE | MAP_ANONYMOUS flag. MAP_PRIVATE bruges, fordi kortlægningsområdet ikke deles med andre processer, og MAP_ANONYMOUS bruges, fordi her har vi ikke kortlagt nogen fil. Af samme grund er den filbeskrivelse og forskudt værdi er indstillet til 0.

Eksempel 2.c

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

const char * filepath = argv [1];
int fd = åben (filsti, O_RDONLY);
hvis (fd < 0)
printf ("\ n \"% s \ ""kunne ikke åbne \ n"",
filesti)
Gratis og open source-spilmotorer til udvikling af Linux-spil
Denne artikel dækker en liste over gratis og open source-spilmotorer, der kan bruges til at udvikle 2D- og 3D-spil på Linux. Der er mange sådanne spil...
Shadow of the Tomb Raider til Linux-vejledning
Shadow of the Tomb Raider er den tolvte tilføjelse til Tomb Raider-serien - en action-adventure-spilfranchise oprettet af Eidos Montreal. Spillet blev...
Sådan styrkes FPS i Linux?
FPS står for Billeder i sekundet. FPS's opgave er at måle billedhastigheden i videoafspilninger eller spiloptræden. I enkle ord betegnes antallet af u...