C Programmeerimine

Kuidas kasutada mmap-funktsiooni C-keeles?

Kuidas kasutada mmap-funktsiooni C-keeles?
The mmap () Funktsiooni kasutatakse protsessi aadressiruumi ja failide või seadmete vahel kaardistamiseks. Kui fail on kaardistatud protsessi aadressiruumi, saab faili juurde pääseda nagu massiivi programmis. See on üks kõige tõhusamaid viise failis olevatele andmetele juurde pääsemiseks ja pakub sujuvat kodeerimisliidest, mis on loomulik andmestruktuuri jaoks, mida saab hinnata ilma failidest lugemise ja kirjutamise abstraktsioonita. Selles artiklis arutleme selle üle, kuidas mmap () funktsioon Linuxis. Alustame siis.

Päisefail:

# kaasata

Sü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; iprintf ("[% d]", ptr [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)
Parimad Linuxi käsurea mängud
Käsurida pole Linuxi kasutamisel lihtsalt teie suurim liitlane - see võib olla ka meelelahutusallikas, sest saate seda kasutada paljude lõbusate mängu...
Parimad Linuxi mängupuldi kaardistamise rakendused
Kui teile meeldib mängida Linuxis mänge tavalise klaviatuuri ja hiire sisestussüsteemi asemel mängupuldiga, on teie jaoks mõned kasulikud rakendused. ...
Kasulikud tööriistad Linuxi mängijatele
Kui teile meeldib Linuxis mänge mängida, on tõenäoline, et olete mängukogemuse parandamiseks kasutanud selliseid rakendusi ja utiliite nagu Wine, Lutr...