C Programovanie

Ako používať funkciu mmap v jazyku C?

Ako používať funkciu mmap v jazyku C?
The mmap () Táto funkcia sa používa na mapovanie medzi adresným priestorom procesu a súbormi alebo zariadeniami. Keď je súbor namapovaný na adresný priestor procesu, je k nemu možné získať prístup ako k súboru v programe. Toto je jeden z najefektívnejších spôsobov prístupu k údajom v súbore a poskytuje plynulé kódovacie rozhranie, ktoré je prirodzené pre dátovú štruktúru, ktorú je možné vyhodnotiť bez abstrakcie čítania a zápisu zo súborov. V tomto článku sa chystáme diskutovať o tom, ako používať mmap () funkcia v Linuxe. Takže poďme na to.

Hlavičkový súbor:

#include

Syntax:

void * mmap (void * adresa, size_t dĺžka, int ochrana, int príznaky, int podklady,
offset_t)

Argumenty:

Funkcia má 6 argumentov:

1. adresa:

Tento argument poskytuje preferovanú začiatočnú adresu pre mapovanie. Ak tam iné mapovanie neexistuje, potom jadro vyberie hranicu blízkej stránky a vytvorí mapovanie; inak jadro vyberie novú adresu. Ak má tento argument hodnotu NULL, môže jadro umiestniť mapovanie na ľubovoľné miesto, ktoré uzná za vhodné.

2. dĺžka:

Toto je počet bajtov, ktoré sa majú mapovať.

3. chrániť:

Tento argument sa používa na kontrolu toho, aký druh prístupu je povolený. Tento argument môže byť logickým „ALEBO“ nasledujúcich príznakov PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE.  Typy prístupu na čítanie, zápis a vykonávanie sú povolenia pre obsah.

4. vlajky:

Tento argument sa používa na riadenie povahy mapy. Nasleduje niekoľko bežných hodnôt príznakov:

  • MAP_SHARED: Tento príznak sa používa na zdieľanie mapovania so všetkými ostatnými procesmi, ktoré sú mapované na tento objekt. Zmeny vykonané v mapovacej oblasti sa zapíšu späť do súboru.
  • MAP_PRIVATE: Ak sa použije tento príznak, mapovanie neuvidia žiadne ďalšie procesy a vykonané zmeny sa nezapíšu do súboru.
  • MAP_ANONYMOUS / MAP_ANON: Tento príznak sa používa na vytvorenie anonymného mapovania. Anonymné mapovanie znamená, že mapovanie nie je spojené so žiadnymi súbormi. Toto mapovanie sa používa ako základný primitív na rozšírenie haldy.
  • MAP_FIXED: Ak sa použije tento príznak, musí byť systém nútený použiť presnú mapovaciu adresu uvedenú v adresa Ak to nie je možné, mapovanie zlyhá.

5. kartotéky:

Toto je deskriptor súborov, ktorý musí byť mapovaný.

6. offset:

Toto je posunuté od miesta, kde začalo mapovanie súboru. Zjednodušene povedané, mapovanie sa spája s (offset) do (offset + dĺžka-1) bajtov pre súbor otvorený dňa kartotéky deskriptor.

Návratové hodnoty:

O úspechu mmap () vracia 0; pre zlyhanie funkcia vráti MAP_FAILED.

Obrázkovo môžeme funkciu mapy znázorniť nasledovne:

Na zrušenie mapovania mapovanej oblasti munmap () funkcia sa používa:

Syntax:

int munmap(neplatné *adresa, size_t dĺžka);

Návratové hodnoty:

O úspechu munmap () vracia 0; pri zlyhaní funkcia vráti -1.

Príklady:

Teraz uvidíme ukážkový program pre každé z nasledujúcich pomocou systémového volania mmap ():

  • Pridelenie pamäte (príklad 1.c)
  • Čítanie súboru (príklad 2.c)
  • Zápisový súbor (Príklad3.c)
  • Medziprocesová komunikácia (Príklad4.c)

Príklad 1.c

#include
#include
int main ()
int N = 5; // Počet prvkov pre pole
int * ptr = mmap (NULL, N * sizeof (int),
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS,
0, 0);
if (ptr == MAP_FAILED)
printf ("Mapovanie zlyhalo \ n");
návrat 1;

// Vyplňte prvky poľa
pre (int i = 0; i ");
pre (int i = 0; iprintf ("[% d]", ptr [i]);

printf ("\ n");
int err = munmap (ptr, 10 * sizeof (int));
ak (chyba != 0)
printf ("Unmapping Failed \ n");
návrat 1;

návrat 0;

V príklade 1.c alokujeme pamäť pomocou mmap. Tu sme použili PROT_READ | PROT_WRITE ochrana pre čítanie a zápis do mapovanej oblasti. Použili sme MAP_PRIVATE | Vlajka MAP_ANONYMOUS. MAP_PRIVATE sa používa, pretože mapovacia oblasť nie je zdieľaná s inými procesmi, a MAP_ANONYMOUS sa používa, pretože tu sme nemapovali žiadny súbor. Z rovnakého dôvodu deskriptor súborov a vyrovnať hodnota je nastavená na 0.

Príklad 2.c

#include
#include
#include
#include
#include
#include
int main (int argc, char * argv [])
ak (argc < 2)
printf ("Cesta k súboru nie je uvedená \ n");
výstup (0);

const char * cesta_souboru = argv [1];
int fd = open (cesta k súboru, O_RDONLY);
ak (fd < 0)
printf ("\ n \"% s \ ""sa nepodarilo otvoriť \ n"",
cesta k súboru)
Hry HD remasterované hry pre Linux, ktoré nikdy predtým nemali vydanie Linuxu
HD remasterované hry pre Linux, ktoré nikdy predtým nemali vydanie Linuxu
Mnoho vývojárov a vydavateľov hier prichádza s remastrom starých hier v rozlíšení HD, aby predĺžili životnosť franšízy. Prosím fanúšikov, ktorí požadu...
Hry Ako používať AutoKey na automatizáciu hier pre Linux
Ako používať AutoKey na automatizáciu hier pre Linux
AutoKey je obslužný program na automatizáciu stolných počítačov pre systémy Linux a X11, programovaný v programoch Python 3, GTK a Qt. Pomocou jeho fu...
Hry Ako zobraziť počítadlo FPS v hrách Linux
Ako zobraziť počítadlo FPS v hrách Linux
Hranie na systéme Linux získalo veľký tlak, keď spoločnosť Valve v roku 2012 oznámila podporu systému Linux pre klienta Steam a ich hry. Od tej doby s...