Päisefail:
# kaasataSüntaks:
void * mmap (void * aadress, suurus_t pikkus, int kaitse, int lipud, int failid,off_t nihe)
Argumendid:
Funktsioonil on 6 argumenti:
1. aadress:
See argument annab kaardistamiseks eelistatud lähteaadressi. Kui teist kaardistamist seal pole, valib kernel lähedalasuva lehepiiri ja loob kaardistuse; vastasel juhul valib kern uue aadressi. Kui selle argumendi väärtus on NULL, võib tuum asetada kaardistuse kõikjale, kuhu ta õigeks peab.
2. pikkus:
See on kaardistatavate baitide arv.
3. kaitsta:
Seda argumenti kasutatakse selleks, et kontrollida, millist tüüpi juurdepääs on lubatud. See argument võib olla järgmiste lippude loogiline „OR” PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE. Lugemis-, kirjutamis- ja teostusjuurdepääsu tüübid on sisu õigused.
4. lipud:
Seda argumenti kasutatakse kaardi olemuse kontrollimiseks. Järgnevalt on toodud lippude ühised väärtused:
- MAP_SHARED: Seda lippu kasutatakse kaardistamise jagamiseks kõigi teiste selle objektiga kaardistatud protsessidega. Kaardistuspiirkonnas tehtud muudatused kirjutatakse faili tagasi.
- MAP_PRIVATE: Selle lipu kasutamisel ei näe kaardistamine muud protsessid ja tehtud muudatusi ei kirjutata faili.
- MAP_ANONYMOUS / MAP_ANON: Seda lippu kasutatakse anonüümse kaardistamise loomiseks. Anonüümne kaardistamine tähendab, et kaardistamine pole ühendatud ühegi failiga. Seda kaardistamist kasutatakse kuhja pikendamise põhiprimitiivina.
- MAP_FIXED: Selle lipu kasutamisel tuleb süsteem sundida kasutama täpset kaardistamisaadressi, mis on täpsustatud aadress Kui see pole võimalik, siis kaardistamine nurjub.
5. failid:
See on faili kirjeldaja, mis tuleb kaardistada.
6. nihe:
See kompenseeritakse failide kaardistamise algusest. Lihtsamalt öeldes ühendatakse kaardistamine (nihe) kuni (nihe + pikkus-1) faili baidid on avatud filedes kirjeldaja.
Tagastusväärtused:
Edu saavutamisel on mmap () tagastab 0; rikke korral tagastab funktsioon MAP_FAILED.
Piltlikult võime kaardifunktsiooni kujutada järgmiselt:
Kaardistatud piirkonna kaardistamise tühistamiseks munmap () funktsiooni kasutatakse:
Süntaks:
int munmap(kehtetu *aadress, suurus_t pikkus);
Tagastusväärtused:
Edu saavutamisel on munmap () tagastab 0; rikke korral tagastab funktsioon -1.
Näited:
Nüüd näeme mmap () süsteemikõne abil näidisprogrammi igale järgnevale:
- Mälu eraldamine (näide1.c)
- Faili lugemine (näide2.c)
- Faili kirjutamine (näide3.c)
- Protsessidevaheline suhtlus (näide4.c)
Näide1.c
# kaasata# kaasata
int main ()
int N = 5; // Massiivi elementide arv
int * ptr = mmap (NULL, N * (int) suurus,
PROT_READ | PROT_WRITE,
KAART_PRIVAAT | KAART_ANONÜÜMINE,
0, 0);
kui (ptr == MAP_FAILED)
printf ("Kaardistamine ebaõnnestus \ n");
tagastus 1;
// Täitke massiivi elemendid
jaoks (int i = 0; i ");
jaoks (int i = 0; i
printf ("\ n");
int err = munmap (ptr, 10 * sizeof (int));
kui (viga != 0)
printf ("Kaardistamine ebaõnnestus \ n");
tagastus 1;
tagastama 0;
Näites1.c eraldame mälu mmap abil. Siin kasutasime PROT_READ | Kaart PROT_WRITE kaardistatud piirkonda lugemiseks ja kirjutamiseks. Kasutasime MAP_PRIVATE | MAP_ANONYMMUS lipp. MAP_PRIVATE kasutatakse seetõttu, et kaardistuspiirkonda ei jagata teiste protsessidega, ja MAP_ANONYMOUS kasutatakse seetõttu, et siin pole me ühtegi faili kaardistanud. Samal põhjusel faili kirjeldaja ja nihe väärtuseks on seatud 0.
Näide2.c
# kaasata# kaasata
# kaasata
# kaasata
# kaasata
# kaasata
int main (int argc, char * argv [])
kui (arg < 2)
printf ("Faili rada pole mainitud \ n");
väljumine (0);
const char * filepath = argv [1];
int fd = avatud (filepath, O_RDONLY);
kui (fd < 0)
printf ("\ n \"% s \ ""ei õnnestunud avada \ n"",
faili teekond)