Antraštės failas:
# įtrauktiSintaksė:
negaliojantis * mmap (negaliojantis * adresas, dydis_t ilgis, int apsaugoti, int vėliavos, int failai,off_t offset)
Argumentai:
Funkcijai reikalingi 6 argumentai:
1. adresas:
Šis argumentas nurodo pageidaujamą pradinį žemėlapio adresą. Jei kito kartografavimo ten nėra, branduolys pasirenka netoliese esančią puslapio ribą ir sukuria atvaizdavimą; priešingu atveju branduolys pasirenka naują adresą. Jei šis argumentas yra NULL, tada branduolys gali įdėti atvaizdavimą bet kur, kur jai atrodo tinkama.
2. ilgis:
Tai yra suskirstomų baitų skaičius.
3. apsaugoti:
Šis argumentas naudojamas norint kontroliuoti, kokia prieiga yra leidžiama. Šis argumentas gali būti logiškas šių žymių „OR“ PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE. Skaitymo, rašymo ir vykdymo prieigos tipai yra turinio leidimai.
4. vėliavos:
Šis argumentas naudojamas kontroliuoti žemėlapio pobūdį. Toliau pateikiamos kelios bendros vėliavų vertės:
- MAP_SHARED: Ši žyma naudojama bendrinti žemėlapius su visais kitais procesais, kurie yra susieti su šiuo objektu. Atlikti susiejimo regiono pakeitimai bus įrašyti atgal į failą.
- MAP_PRIVATE: Kai naudojama ši žyma, susiejimas nebus matomas jokiuose kituose procesuose, o atlikti pakeitimai nebus įrašyti į failą.
- MAP_ANONYMOUS / MAP_ANON: Ši žyma naudojama anoniminiam žemėlapiui kurti. Anoniminis susiejimas reiškia, kad susiejimas nesusietas su jokiais failais. Šis žemėlapis naudojamas kaip pagrindinis primityvas, norint išplėsti krūvą.
- MAP_FIXED: Kai naudojama ši žyma, sistema turi būti priversta naudoti tikslų žemėlapio adresą, nurodytą adresas Jei tai neįmanoma, tada susieti nepavyks.
5. paduoti:
Tai yra failo aprašas, kurį reikia susieti.
6. kompensuoti:
Tai kompensuojama nuo tos vietos, kur prasidėjo failų susiejimas. Paprasčiau tariant, susiejimas susiejamas su (kompensuoti) į (poslinkis + ilgis-1) atidaryto failo baitai filedes deskriptorius.
Grąžinimo vertės:
Dėl sėkmės mmap () grąžina 0; sugedus, funkcija grąžina MAP_FAILED.
Paveikslėlyje žemėlapio funkciją galime pavaizduoti taip:
Norėdami atvaizduoti susietą regioną munmap () naudojama funkcija:
Sintaksė:
int munmap(tuštuma *adresas, dydis_t ilgio);
Grąžinimo vertės:
Dėl sėkmės munmap () grąžina 0; nesėkmei funkcija grąžina -1.
Pavyzdžiai:
Dabar pamatysime programos pavyzdį kiekvienam iš šių, naudojant mmap () sistemos iškvietimą:
- Atminties paskirstymas (1 pavyzdys.c)
- Skaityti failą (2 pavyzdys.c)
- Rašomas failas (3 pavyzdys.c)
- Tarpprocesinis bendravimas (4 pavyzdys.c)
1 pavyzdys.c
# įtraukti# įtraukti
int main ()
int N = 5; // Masyvo elementų skaičius
int * ptr = mmap (NULL, N * (int) dydis,
PROT_READ | PROT_WRITE,
ŽEMĖLAPIS_PRIVATAS | ŽEMĖLAPIS,
0, 0);
jei (ptr == ŽEMĖLAPIS NEIGIAMAS)
printf ("Nepavyko susieti žemėlapių \ n");
grąžinti 1;
// Užpildykite masyvo elementus
už (int i = 0; i ");
už (int i = 0; i
printf ("\ n");
int err = munmap (ptr, 10 * dydisof (int));
jei (klysti != 0)
printf ("Nepavyko atvaizduoti žemėlapio \ n");
grąžinti 1;
grąžinti 0;
1 pavyzdyje.c atmintį paskirstome naudodami mmap. Čia mes naudojome PROT_READ | PROT_WRITE apsauga skaitymui ir rašymui į atvaizduotą regioną. Mes naudojome MAP_PRIVATE | MAP_ANONYMOUS vėliava. MAP_PRIVATE yra naudojamas, nes susiejimo regionas nėra bendrinamas su kitais procesais, o MAP_ANONYMOUS yra naudojamas, nes čia mes nesu susieję jokio failo. Dėl tos pačios priežasties bylos aprašas ir kompensuoti vertė nustatyta į 0.
2 pavyzdys.c
# įtraukti# įtraukti
# įtraukti
# įtraukti
# įtraukti
# įtraukti
int main (int argc, char * argv [])
jei (argument < 2)
printf ("Failo kelias nepaminėtas \ n");
išėjimas (0);
const char * filepath = argv [1];
int fd = atviras (filepath, O_RDONLY);
jei (fd < 0)
printf ("\ n \"% s \ ""nepavyko atidaryti \ n"",
bylos kelias)