Soubor záhlaví:
#zahrnoutSyntax:
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; 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)