Datoteka glave:
#includeSintaksa:
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; 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)