Overskriftsfil:
#inkludereSyntaks:
void * mmap (void * address, size_t length, int protect, int flags, int filedes,off_t offset)
Argumenter:
Funksjonen tar 6 argumenter:
1. adresse:
Dette argumentet gir en foretrukket startadresse for kartleggingen. Hvis det ikke finnes en annen kartlegging der, vil kjernen velge en sidegrense i nærheten og opprette kartleggingen. Ellers velger kjernen en ny adresse. Hvis dette argumentet er NULL, kan kjernen plassere kartleggingen hvor som helst det passer.
2. lengde:
Dette er antall byte som skal tilordnes.
3. beskytte:
Dette argumentet brukes til å kontrollere hva slags tilgang som er tillatt. Dette argumentet kan være logisk 'ELLER' for følgende flagg PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE. Tilgangstypene lese, skrive og utføre er tillatelsene til innholdet.
4. flagg:
Dette argumentet brukes til å kontrollere kartets natur. Følgende er noen vanlige verdier for flaggene:
- MAP_SHARED: Dette flagget brukes til å dele kartleggingen med alle andre prosesser som er kartlagt til dette objektet. Endringer i kartområdet blir skrevet tilbake til filen.
- MAP_PRIVATE: Når dette flagget brukes, vil ikke kartleggingen bli sett av andre prosesser, og endringene som blir gjort vil ikke bli skrevet til filen.
- MAP_ANONYMOUS / MAP_ANON: Dette flagget brukes til å lage en anonym kartlegging. Anonym kartlegging betyr at kartleggingen ikke er koblet til noen filer. Denne kartleggingen brukes som grunnleggende primitiv for å utvide dyngen.
- MAP_FIXED: Når dette flagget brukes, må systemet tvinges til å bruke den nøyaktige kartadressen som er angitt i adresse Hvis dette ikke er mulig, vil kartleggingen mislykkes.
5. arkiverer:
Dette er filbeskrivelsen som må kartlegges.
6. forskyvning:
Dette blir forskjøvet fra hvor filmappingen startet. Enkelt sagt kobles kartleggingen til (forskjøvet) til (forskyvning + lengde-1) byte for filen åpnes den arkiverer deskriptor.
Returverdier:
På suksess, den mmap () returnerer 0; for feil returnerer funksjonen MAP_FAILED.
Bildemessig kan vi representere kartfunksjonen som følger:
For å kartlegge det kartlagte området kartlegge () funksjonen brukes:
Syntaks:
int munmap(tomrom *adresse, størrelse_t lengde);
Returverdier:
På suksess, den kartlegge () returnerer 0; for feil returnerer funksjonen -1.
Eksempler:
Nå vil vi se et eksempelprogram for hvert av de følgende ved hjelp av mmap () systemanrop:
- Minnetildeling (eksempel 1.c)
- Lesefil (eksempel 2.c)
- Skrivefil (eksempel 3.c)
- Interprosesskommunikasjon (Eksempel 4.c)
Eksempel 1.c
#inkludere#inkludere
int main ()
int N = 5; // Antall elementer for matrisen
int * ptr = mmap (NULL, N * sizeof (int),
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS,
0, 0);
hvis (ptr == MAP_FAILED)
printf ("Kartlegging mislyktes \ n");
retur 1;
// Fyll elementene i matrisen
for (int i = 0; i ");
for (int i = 0; i
printf ("\ n");
int err = munmap (ptr, 10 * sizeof (int));
hvis (feil != 0)
printf ("Kartleggingen mislyktes \ n");
retur 1;
retur 0;
I eksempel 1.c vi tildeler minne ved hjelp av mmap. Her brukte vi PROT_READ | PROT_WRITE-beskyttelse for lesing og skriving til den kartlagte regionen. Vi brukte MAP_PRIVATE | MAP_ANONYMOUS flagg. MAP_PRIVATE brukes fordi kartområdet ikke deles med andre prosesser, og MAP_ANONYMOUS brukes fordi her har vi ikke kartlagt noen fil. Av samme grunn er den filbeskrivelse og forskyvning verdien er satt til 0.
Eksempel 2.c
#inkludere#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
int main (int argc, char * argv [])
hvis (argc < 2)
printf ("Filsti ikke nevnt \ n");
exit (0);
const char * filepath = argv [1];
int fd = åpen (filbane, O_RDONLY);
hvis (fd < 0)
printf ("\ n \"% s \ ""kunne ikke åpne \ n"",
filesti)