Datoteka zaglavlja:
#includeSintaksa:
void * mmap (void * adresa, veličina_t duljina, int zaštita, int zastave, int datoteke,off_t offset)
Argumenti:
Funkcija uzima 6 argumenata:
1. adresa:
Ovaj argument daje željenu početnu adresu za mapiranje. Ako drugo mapiranje tamo ne postoji, tada će kernel odabrati obližnju granicu stranice i stvoriti mapiranje; u suprotnom, kernel odabire novu adresu. Ako je ovaj argument NULL, tada jezgra može smjestiti mapiranje bilo gdje gdje to smatra prikladnim.
2. duljina:
Ovo je broj bajtova za mapiranje.
3. zaštititi:
Ovaj se argument koristi za kontrolu vrste pristupa koja je dopuštena. Ovaj argument može biti logičan "ILI" sljedećih zastavica PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE. Vrste pristupa za čitanje, pisanje i izvršavanje dopuštenja su za sadržaj.
4. zastave:
Ovaj se argument koristi za kontrolu prirode mape. Slijede neke uobičajene vrijednosti zastava:
- KARTA_DIJELJENA: Ova se zastava koristi za dijeljenje mapiranja sa svim ostalim procesima koji su mapirani na ovaj objekt. Promjene napravljene u regiji mapiranja bit će zapisane natrag u datoteku.
- KARTA_PRIVATNA: Kada se koristi ova zastavica, preslikavanje neće vidjeti niti jedan drugi postupak, a izvršene promjene neće biti zapisane u datoteku.
- MAP_ANONIMAN / MAP_ANON: Ova se zastava koristi za stvaranje anonimnog mapiranja. Anonimno mapiranje znači da mapiranje nije povezano ni s jednom datotekom. Ovo se mapiranje koristi kao osnovni primitiv za proširenje hrpe.
- KARTA_FIKSIRANA: Kada se koristi ova zastavica, sustav mora biti prisiljen koristiti točnu adresu mapiranja navedenu u adresa Ako to nije moguće, tada mapiranje neće uspjeti.
5. polja:
Ovo je deskriptor datoteke koji se mora preslikati.
6. pomak:
To se odmaklo od mjesta gdje je započeto mapiranje datoteke. Jednostavno rečeno, mapiranje se povezuje sa (pomak) do (pomak + duljina-1) bajtova za datoteku otvorenu na polja deskriptor.
Povratne vrijednosti:
O uspjehu, mmap () vraća 0; u slučaju neuspjeha, funkcija vraća MAP_FAILED.
Slikovito možemo prikazati funkciju karte na sljedeći način:
Za mapiranje mapirane regije karta () koristi se funkcija:
Sintaksa:
int munmap(praznina *adresa, veličina_t duljina);
Povratne vrijednosti:
O uspjehu, karta () vraća 0; u slučaju kvara, funkcija vraća -1.
Primjeri:
Sada ćemo vidjeti primjer programa za svaki od sljedećih pomoću sistemskog poziva mmap ():
- Dodjela memorije (Primjer1.c)
- Datoteka za čitanje (Primjer2.c)
- Datoteka za pisanje (Primjer3.c)
- Međuprocesna komunikacija (Primjer4.c)
Primjer1.c
#include#include
int main ()
int N = 5; // Broj elemenata za niz
int * ptr = mmap (NULL, N * sizeof (int),
PROT_READ | PROT_PIŠI,
KARTA_PRIVATNA | KARTA_ANONIMNA,
0, 0);
if (ptr == MAP_FAILED)
printf ("Mapiranje nije uspjelo \ n");
povratak 1;
// Ispunite elemente niza
za (int i = 0; i ");
za (int i = 0; i
printf ("\ n");
int err = munmap (ptr, 10 * sizeof (int));
ako (pogreška != 0)
printf ("Otkazivanje mapiranja nije uspjelo \ n");
povratak 1;
return 0;
U Primjeru1.c alociramo memoriju pomoću mmap-a. Ovdje smo koristili PROT_READ | PROT_WRITE zaštita za čitanje i pisanje u mapiranu regiju. Koristili smo MAP_PRIVATE | MAP_ANONYMOUS zastava. Koristi se MAP_PRIVATE jer se regija mapiranja ne dijeli s drugim procesima, a koristi se MAP_ANONYMOUS jer ovdje nismo mapirali nijednu datoteku. Iz istog razloga, deskriptor datoteke i ofset vrijednost je postavljena na 0.
Primjer2.c
#include#include
#include
#include
#include
#include
int glavni (int argc, char * argv [])
ako (argc < 2)
printf ("Put do datoteke nije spomenut \ n");
izlaz (0);
const char * put datoteke = argv [1];
int fd = otvoren (put datoteke, O_RDONLY);
ako (fd < 0)
printf ("\ n \"% s \ ""se ne može otvoriti \ n"",
put datoteke)