C Programiranje

Kako uporabljati funkcijo mmap v jeziku C?

Kako uporabljati funkcijo mmap v jeziku C?
The mmap () funkcija se uporablja za preslikavo med naslovnim prostorom procesa in datotekami ali napravami. Ko je datoteka preslikana v naslovni prostor procesa, je do nje mogoče dostopati kot matrika v programu. To je eden najučinkovitejših načinov dostopa do podatkov v datoteki in zagotavlja brezhiben vmesnik za kodiranje, ki je naraven za podatkovno strukturo, ki jo je mogoče oceniti brez abstrakcije branja in pisanja iz datotek. V tem članku bomo razpravljali o uporabi mmap () funkcijo v Linuxu. Torej, začnimo.

Datoteka glave:

#include

Sintaksa:

void * mmap (void * naslov, size_t length, int zaščita, int zastavice, int datoteke,
off_t offset)

Argumenti:

Funkcija ima 6 argumentov:

1. naslov:

Ta argument daje prednostni začetni naslov za preslikavo. Če drugo preslikavo tam ne obstaja, bo jedro izbralo bližnjo mejo strani in ustvarilo preslikavo; v nasprotnem primeru jedro izbere nov naslov. Če je ta argument NULL, lahko jedro preslikavo postavi kamor koli se mu zdi primerno.

2. dolžina:

To je število bajtov, ki jih je treba preslikati.

3. zaščititi:

Ta argument se uporablja za nadzor vrste dovoljenega dostopa. Ta argument je lahko logičen "ALI" naslednjih zastavic PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE.  Vrste dostopa za branje, pisanje in izvajanje so dovoljenja za vsebino.

4. zastave:

Ta argument se uporablja za nadzor narave zemljevida. Sledi nekaj skupnih vrednosti zastav:

  • MAP_SHARED: Ta zastava se uporablja za skupno rabo preslikave z vsemi drugimi procesi, ki so preslikani na ta objekt. Spremembe na območju preslikave bodo zapisane nazaj v datoteko.
  • MAP_PRIVATE: Ko se uporabi ta zastavica, preslikave ne bodo videli nobeni drugi procesi in izvedene spremembe ne bodo zapisane v datoteko.
  • MAP_ANONYMOUS / MAP_ANON: Ta zastava se uporablja za ustvarjanje anonimnega preslikavanja. Anonimno preslikavanje pomeni, da preslikava ni povezana z nobeno datoteko. To preslikavanje se uporablja kot osnovni primitiv za razširitev kupa.
  • MAP_FIXED: Ko se uporablja ta zastavica, mora biti sistem prisiljen uporabiti natančen naslov preslikave, določen v naslov Če to ni mogoče, preslikava ne bo uspela.

5. prijavitelji:

To je deskriptor datoteke, ki ga je treba preslikati.

6. odmik:

To se odmika od mesta, kjer se je začelo preslikavanje datotek. Preprosto povedano, preslikava se poveže z (odmik) do (odmik + dolžina-1) bajtov za datoteko, odprto dne vložniki deskriptor.

Vrnjene vrednosti:

O uspehu, mmap () vrne 0; v primeru okvare funkcija vrne MAP_FAILED.

Slikovno lahko funkcijo zemljevida predstavimo na naslednji način:

Za preslikavo preslikane regije munmap () funkcija se uporablja:

Sintaksa:

int munmap(praznina *naslov, velikost_t dolžina);

Vrnjene vrednosti:

O uspehu, munmap () vrne 0; v primeru okvare funkcija vrne -1.

Primeri:

Zdaj bomo videli sistemski program za vsako od naslednjih z uporabo sistemskega klica mmap ():

  • Dodelitev pomnilnika (primer1.c)
  • Branje datoteke (primer2.c)
  • Pisanje datoteke (primer3.c)
  • Medprocesna komunikacija (primer4.c)

Primer1.c

#include
#include
int main ()
int N = 5; // Število elementov za matriko
int * ptr = mmap (NULL, N * sizeof (int),
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONIMNO,
0, 0);
če (ptr == MAP_FAILED)
printf ("Preslikava ni uspela \ n");
vrnitev 1;

// Izpolnimo elemente polja
za (int i = 0; i ");
za (int i = 0; iprintf ("[% d]", ptr [i]);

printf ("\ n");
int err = munmap (ptr, 10 * sizeof (int));
če (napaka != 0)
printf ("Odstranjevanje preslikave ni uspelo \ n");
vrnitev 1;

vrnitev 0;

V primeru1.c dodeljujemo pomnilnik s pomočjo mmap. Tu smo uporabili PROT_READ | PROT_WRITE zaščita za branje in pisanje na preslikano regijo. Uporabili smo MAP_PRIVATE | Zastava MAP_ANONYMOUS. MAP_PRIVATE se uporablja, ker območja preslikave ni v skupni rabi z drugimi procesi, MAP_ANONYMOUS pa, ker tukaj nismo preslikali nobene datoteke. Iz istega razloga je deskriptor datoteke in odmik vrednost je nastavljena na 0.

Primer2.c

#include
#include
#include
#include
#include
#include
int main (int argc, char * argv [])
če (argc < 2)
printf ("Pot datoteke ni omenjena \ n");
izhod (0);

const char * pot datoteke = argv [1];
int fd = odprto (pot do datoteke, O_RDONLY);
če (fd < 0)
printf ("\ n \"% s \ ""ni bilo mogoče odpreti \ n"",
pot datoteke)
Kako prikazati števec FPS v igrah Linux
Linux gaming je dobil velik zagon, ko je Valve leta 2012 napovedal podporo Linuxu za odjemalca Steam in njihove igre. Od takrat se je veliko AAA in in...
Kako prenesti in igrati Sid Meier's Civilization VI v Linuxu
Uvod v igro Civilization 6 je sodoben pogled na klasični koncept, uveden v seriji iger Age of Empires. Ideja je bila dokaj preprosta; začeli bi v zelo...
Kako namestiti in igrati Doom v Linuxu
Uvod v Doom Serija Doom je nastala v devetdesetih letih po izidu prvotnega Dooma. Bil je takojšen hit in od takrat naprej je serija iger prejela števi...