C Programmēšana

Kā izmantot mmap funkciju C valodā?

Kā izmantot mmap funkciju C valodā?
The mmap () funkcija tiek izmantota kartēšanai starp procesa adreses vietu un failiem vai ierīcēm. Kad fails ir piesaistīts procesa adreses vietai, failam var piekļūt kā masīvam programmā. Šis ir viens no efektīvākajiem veidiem, kā piekļūt failā esošajiem datiem, un nodrošina vienmērīgu kodēšanas saskarni, kas ir dabiska datu struktūrai, kuru var novērtēt bez abstrakcijas lasīšanas un rakstīšanas no failiem. Šajā rakstā mēs apspriedīsim, kā izmantot mmap () funkcija Linux. Tātad, sāksim darbu.

Galvenes fails:

# iekļaut

Sintakse:

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; iprintf ("[% d]", ptr [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)
Kā mainīt peles un skārienpaliktņu ritināšanas virzienu operētājsistēmā Windows 10
Pele un SkārienpaliktnisTas ne tikai padara skaitļošanu vienkāršu, bet arī efektīvāku un mazāk laikietilpīgu. Mēs nevaram iedomāties dzīvi bez šīm ier...
Kā mainīt peles rādītāja un kursora izmēru, krāsu un shēmu operētājsistēmā Windows 10
Peles rādītājs un kursors operētājsistēmā Windows 10 ir ļoti svarīgi operētājsistēmas aspekti. To var teikt arī par citām operētājsistēmām, tāpēc pati...
Bezmaksas un atvērtā koda spēļu dzinēji Linux spēļu izstrādei
Šis raksts aptvers bezmaksas un atvērtā koda spēļu motoru sarakstu, kurus var izmantot, lai izstrādātu 2D un 3D spēles Linux. Šādu spēļu dzinēju ir da...