Galvenes fails:
# iekļautSintakse:
void * mmap (void * adrese, size_t garums, int aizsargāt, int karodziņi, int faili,off_t nobīde)
Argumenti:
Funkcijai nepieciešami 6 argumenti:
1. adrese:
Šis arguments dod vēlamo sākuma adresi kartēšanai. Ja cita kartēšana tur nepastāv, kodols izvēlēsies blakus esošās lapas robežu un izveidos kartēšanu; pretējā gadījumā kodols izvēlas jaunu adresi. Ja šis arguments ir NULL, kodols var ievietot kartēšanu visur, kur tā uzskata par vajadzīgu.
2. garums:
Šis ir kartējamo baitu skaits.
3. aizsargāt:
Šis arguments tiek izmantots, lai kontrolētu, kāda veida piekļuve ir atļauta. Šis arguments var būt loģisks “OR” no šiem karodziņiem PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE. Lasīšanas, rakstīšanas un izpildes piekļuves veidi ir satura atļaujas.
4. karogi:
Šis arguments tiek izmantots, lai kontrolētu kartes raksturu. Tālāk ir norādītas dažas kopīgas karogu vērtības:
- MAP_SHARED: Šis karodziņš tiek izmantots, lai koplietotu kartēšanu ar visiem citiem procesiem, kas tiek kartēti ar šo objektu. Kartēšanas reģionā veiktās izmaiņas tiks ierakstītas atpakaļ failā.
- KARTES PRIVĀTUMS: Ja tiek izmantots šis karodziņš, kartēšanu neredzēs citi procesi, un veiktās izmaiņas netiks ierakstītas failā.
- MAP_ANONYMOUS / MAP_ANON: Šis karodziņš tiek izmantots, lai izveidotu anonīmu kartēšanu. Anonīma kartēšana nozīmē, ka kartēšana nav savienota ar failiem. Šo kartēšanu izmanto kā primitīvu kaudzes pagarināšanai.
- MAP_FIXED: Ja tiek izmantots šis karodziņš, sistēmai ir jāpiespiež izmantot precīzu kartēšanas adresi, kas norādīta adrese Ja tas nav iespējams, kartēšana neizdosies.
5. filedes:
Šis ir faila deskriptors, kas ir jāaplūko.
6. kompensācija:
Tas tiek kompensēts no vietas, kur sākta failu kartēšana. Vienkārši sakot, kartēšana savienojas ar (kompensēt) uz (nobīde + garums-1) faila baiti ir atvērti filedes deskriptors.
Atgriešanās vērtības:
Pēc panākumiem mmap () atgriež 0; kļūmes gadījumā funkcija atgriež MAP_FAILED.
Attēlā kartes funkciju varam attēlot šādi:
Lai atceltu kartēto reģionu munmap () tiek izmantota funkcija:
Sintakse:
int munmap(spēkā neesošs *adrese, izmērs_t garums);
Atgriešanās vērtības:
Pēc panākumiem munmap () atgriež 0; neveiksmes gadījumā funkcija atgriež -1.
Piemēri:
Tagad mēs redzēsim programmas piemēru katram no šiem veidiem, izmantojot mmap () sistēmas izsaukumu:
- Atmiņas piešķiršana (1. piemērs.c)
- Faila lasīšana (2. piemērs.c)
- Raksta fails (3. piemērs.c)
- Starpprocesu komunikācija (4. piemērs.c)
1. piemērs.c
# iekļaut# iekļaut
int main ()
int N = 5; // Masīva elementu skaits
int * ptr = mmap (NULL, N * (int) izmērs,
PROT_READ | PROT_WRITE,
KARTE_PRIVĀTA | KARTE_ANONĪMS,
0, 0);
ja (ptr == MAP_FAILED)
printf ("Kartēšana neizdevās \ n");
atgriezties 1;
// Aizpildiet masīva elementus
par (int i = 0; i ");
par (int i = 0; i
printf ("\ n");
int err = munmap (ptr, 10 * sizeof (int));
ja (kļūda != 0)
printf ("Neizdevās atcelt kartēšanu \ n");
atgriezties 1;
atgriešanās 0;
1. piemērā.c mēs piešķiram atmiņu, izmantojot mmap. Šeit mēs izmantojām PROT_READ | PROT_WRITE aizsardzība lasīšanai un rakstīšanai kartētajā reģionā. Mēs izmantojām MAP_PRIVATE | MAP_ANONYMOUS karogs. MAP_PRIVATE tiek izmantots, jo kartēšanas reģions netiek koplietots ar citiem procesiem, un tiek izmantots MAP_ANONYMOUS, jo šeit mēs neesam kartējuši nevienu failu. Tā paša iemesla dēļ faila deskriptors un kompensēt vērtība ir iestatīta uz 0.
2. piemērs.c
# iekļaut# iekļaut
# iekļaut
# iekļaut
# iekļaut
# iekļaut
int main (int argc, char * argv [])
ja (arg < 2)
printf ("Faila ceļš nav minēts \ n");
izeja (0);
const char * filepath = argv [1];
int fd = atvērts (filepath, O_RDONLY);
ja (fd < 0)
printf ("\ n \"% s \ ""nevarēja atvērt \ n"",
filepath)