C programavimas

Kaip naudoti mmap funkciją C kalba?

Kaip naudoti mmap funkciją C kalba?
The mmap () funkcija naudojama atvaizduoti proceso adreso erdvę ir failus ar įrenginius. Kai failas susietas su proceso adreso erdve, failą galima pasiekti kaip masyvą programoje. Tai yra vienas iš efektyviausių būdų pasiekti failo duomenis ir suteikia vientisą kodavimo sąsają, kuri yra natūrali duomenų struktūrai, kurią galima įvertinti be abstrakcijos skaityti ir rašyti iš failų. Šiame straipsnyje aptarsime, kaip naudoti mmap () funkcija „Linux“. Taigi, pradėkime.

Antraštės failas:

# įtraukti

Sintaksė:

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; iprintf ("[% d]", ptr [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)
„WinMouse“ leidžia tinkinti ir pagerinti pelės žymeklio judėjimą „Windows“ kompiuteryje
Jei norite pagerinti numatytąsias pelės žymiklio funkcijas, naudokite nemokamą programinę įrangą „WinMouse“. Tai prideda daugiau funkcijų, kurios padė...
Pelės kairiuoju pelės mygtuku mygtukas neveikia „Windows 10“
Jei naudojate specialią pelę su savo nešiojamuoju kompiuteriu arba staliniu kompiuteriu, tačiau neveikia pelės kairysis mygtukas dėl tam tikrų priežas...
Žymeklis peršoka arba juda atsitiktinai, kai rašote „Windows 10“
Jei pastebite, kad pelės žymeklis peršoka arba juda pats, automatiškai, atsitiktinai, kai vedate „Windows“ nešiojamąjį kompiuterį ar kompiuterį, kai k...