C Programování

Jak používat funkci mmap v jazyce C?

Jak používat funkci mmap v jazyce C?
The mmap () Funkce se používá pro mapování mezi adresovým prostorem procesu a soubory nebo zařízeními. Když je soubor namapován na adresní prostor procesu, lze k němu přistupovat jako k poli v programu. Toto je jeden z nejúčinnějších způsobů přístupu k datům v souboru a poskytuje bezproblémové kódovací rozhraní, které je přirozené pro datovou strukturu, kterou lze vyhodnotit bez abstrakce čtení a zápisu ze souborů. V tomto článku budeme diskutovat o tom, jak používat mmap () funkce v Linuxu. Pojďme tedy začít.

Soubor záhlaví:

#zahrnout

Syntax:

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

Argumenty:

Funkce má 6 argumentů:

1. adresa:

Tento argument dává preferovanou počáteční adresu pro mapování. Pokud tam další mapování neexistuje, pak jádro vybere hranici stránky poblíž a vytvoří mapování; jinak jádro vybere novou adresu. Pokud má tento argument hodnotu NULL, může jádro umístit mapování kamkoli uzná za vhodné.

2. délka:

Toto je počet bajtů, které mají být mapovány.

3. chránit:

Tento argument se používá k řízení, jaký druh přístupu je povolen. Tento argument může být logickým „NEBO“ následujících příznaků PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE.  Typy přístupu pro čtení, zápis a spuštění jsou oprávnění k obsahu.

4. vlajky:

Tento argument se používá k řízení povahy mapy. Následuje několik běžných hodnot příznaků:

  • MAP_SHARED: Tento příznak se používá ke sdílení mapování se všemi ostatními procesy, které jsou mapovány na tento objekt. Změny provedené v oblasti mapování budou zapsány zpět do souboru.
  • MAP_PRIVATE: Když se použije tento příznak, mapování nebude viděno žádnými jinými procesy a provedené změny nebudou zapsány do souboru.
  • MAP_ANONYMOUS / MAP_ANON: Tento příznak se používá k vytvoření anonymního mapování. Anonymní mapování znamená, že mapování není připojeno k žádným souborům. Toto mapování se používá jako základní primitivum k rozšíření haldy.
  • MAP_FIXED: Je-li použit tento příznak, musí být systém nucen použít přesnou mapovací adresu uvedenou v adresa Pokud to není možné, dojde k selhání mapování.

5. kartotéky:

Toto je deskriptor souboru, který musí být mapován.

6. offset:

Toto je posun od místa, kde začalo mapování souboru. Jednoduše řečeno, mapování se připojuje k (offset) na (offset + délka-1) bajtů pro soubor otevřený na kartotéky deskriptor.

Návratové hodnoty:

O úspěchu mmap () vrací 0; pro selhání funkce vrátí MAP_FAILED.

Obrázkově můžeme funkci mapy znázornit takto:

Pro zmapování mapované oblasti munmap () funkce se používá:

Syntax:

int munmap(neplatné *adresa, size_t délka);

Návratové hodnoty:

O úspěchu munmap () vrací 0; při selhání funkce vrátí -1.

Příklady:

Nyní uvidíme ukázkový program pro každý z následujících pomocí systémového volání mmap ():

  • Přidělení paměti (Příklad 1.C)
  • Čtení souboru (Příklad 2.C)
  • Zápis souboru (Příklad 3.C)
  • Meziprocesová komunikace (Příklad 4.C)

Příklad 1.C

#zahrnout
#zahrnout
int main ()
int N = 5; // Počet prvků pro pole
int * ptr = mmap (NULL, N * sizeof (int),
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS,
0, 0);
if (ptr == MAP_FAILED)
printf ("Mapování se nezdařilo \ n");
návrat 1;

// Vyplňte prvky pole
pro (int i = 0; i ");
pro (int i = 0; iprintf ("[% d]", ptr [i]);

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

návrat 0;

V příkladu 1.c přidělujeme paměť pomocí mmap. Zde jsme použili PROT_READ | PROT_WRITE ochrana pro čtení a zápis do mapované oblasti. Použili jsme MAP_PRIVATE | Příznak MAP_ANONYMOUS. MAP_PRIVATE se používá, protože oblast mapování není sdílena s jinými procesy, a MAP_ANONYMOUS se používá, protože zde jsme nemapovali žádný soubor. Ze stejného důvodu deskriptor souboru a offset hodnota je nastavena na 0.

Příklad 2.C

#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout
int main (int argc, char * argv [])
pokud (argc < 2)
printf ("Cesta k souboru nebyla uvedena \ n");
exit (0);

const char * cesta_souboru = argv [1];
int fd = open (cesta k souboru, O_RDONLY);
pokud (fd < 0)
printf ("\ n \"% s \ ""nelze otevřít \ n"",
cesta k souboru)
Hry Nejlepší emulátory herních konzolí pro Linux
Nejlepší emulátory herních konzolí pro Linux
Tento článek uvádí seznam populárního softwaru pro emulaci herních konzolí, který je k dispozici pro Linux. Emulace je vrstva softwarové kompatibility...
Hry Nejlepší linuxové distribuce pro hraní her v roce 2021
Nejlepší linuxové distribuce pro hraní her v roce 2021
Operační systém Linux má za sebou dlouhou cestu od svého původního, jednoduchého vzhledu založeného na serveru. Tento OS se v posledních letech nesmír...
Hry Jak zachytit a streamovat vaši herní relaci v systému Linux
Jak zachytit a streamovat vaši herní relaci v systému Linux
V minulosti bylo hraní her považováno pouze za koníček, ale postupem času došlo v herním průmyslu k obrovskému nárůstu z hlediska technologie a počtu ...