C Programiranje

Kako koristiti funkciju mmap u jeziku C?

Kako koristiti funkciju mmap u jeziku C?
The mmap () funkcija se koristi za mapiranje između adresnog prostora procesa i datoteka ili uređaja. Kada se datoteka preslika u adresni prostor procesa, datoteci se može pristupiti poput niza u programu. Ovo je jedan od najučinkovitijih načina pristupa podacima u datoteci i pruža besprijekorno sučelje kodiranja koje je prirodno za strukturu podataka koja se može procijeniti bez apstrakcije čitanja i pisanja iz datoteka. U ovom ćemo članku razgovarati o tome kako koristiti mmap () funkcija u Linuxu. Pa, krenimo.

Datoteka zaglavlja:

#include

Sintaksa:

void * mmap (void * adresa, veličina_t duljina, int zaštita, int zastave, int datoteke,
off_t offset)

Argumenti:

Funkcija uzima 6 argumenata:

1. adresa:

Ovaj argument daje željenu početnu adresu za mapiranje. Ako drugo mapiranje tamo ne postoji, tada će kernel odabrati obližnju granicu stranice i stvoriti mapiranje; u suprotnom, kernel odabire novu adresu. Ako je ovaj argument NULL, tada jezgra može smjestiti mapiranje bilo gdje gdje to smatra prikladnim.

2. duljina:

Ovo je broj bajtova za mapiranje.

3. zaštititi:

Ovaj se argument koristi za kontrolu vrste pristupa koja je dopuštena. Ovaj argument može biti logičan "ILI" sljedećih zastavica PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE.  Vrste pristupa za čitanje, pisanje i izvršavanje dopuštenja su za sadržaj.

4. zastave:

Ovaj se argument koristi za kontrolu prirode mape. Slijede neke uobičajene vrijednosti zastava:

  • KARTA_DIJELJENA: Ova se zastava koristi za dijeljenje mapiranja sa svim ostalim procesima koji su mapirani na ovaj objekt. Promjene napravljene u regiji mapiranja bit će zapisane natrag u datoteku.
  • KARTA_PRIVATNA: Kada se koristi ova zastavica, preslikavanje neće vidjeti niti jedan drugi postupak, a izvršene promjene neće biti zapisane u datoteku.
  • MAP_ANONIMAN / MAP_ANON: Ova se zastava koristi za stvaranje anonimnog mapiranja. Anonimno mapiranje znači da mapiranje nije povezano ni s jednom datotekom. Ovo se mapiranje koristi kao osnovni primitiv za proširenje hrpe.
  • KARTA_FIKSIRANA: Kada se koristi ova zastavica, sustav mora biti prisiljen koristiti točnu adresu mapiranja navedenu u adresa Ako to nije moguće, tada mapiranje neće uspjeti.

5. polja:

Ovo je deskriptor datoteke koji se mora preslikati.

6. pomak:

To se odmaklo od mjesta gdje je započeto mapiranje datoteke. Jednostavno rečeno, mapiranje se povezuje sa (pomak) do (pomak + duljina-1) bajtova za datoteku otvorenu na polja deskriptor.

Povratne vrijednosti:

O uspjehu, mmap () vraća 0; u slučaju neuspjeha, funkcija vraća MAP_FAILED.

Slikovito možemo prikazati funkciju karte na sljedeći način:

Za mapiranje mapirane regije karta () koristi se funkcija:

Sintaksa:

int munmap(praznina *adresa, veličina_t duljina);

Povratne vrijednosti:

O uspjehu, karta () vraća 0; u slučaju kvara, funkcija vraća -1.

Primjeri:

Sada ćemo vidjeti primjer programa za svaki od sljedećih pomoću sistemskog poziva mmap ():

  • Dodjela memorije (Primjer1.c)
  • Datoteka za čitanje (Primjer2.c)
  • Datoteka za pisanje (Primjer3.c)
  • Međuprocesna komunikacija (Primjer4.c)

Primjer1.c

#include
#include
int main ()
int N = 5; // Broj elemenata za niz
int * ptr = mmap (NULL, N * sizeof (int),
PROT_READ | PROT_PIŠI,
KARTA_PRIVATNA | KARTA_ANONIMNA,
0, 0);
if (ptr == MAP_FAILED)
printf ("Mapiranje nije uspjelo \ n");
povratak 1;

// Ispunite elemente niza
za (int i = 0; i ");
za (int i = 0; iprintf ("[% d]", ptr [i]);

printf ("\ n");
int err = munmap (ptr, 10 * sizeof (int));
ako (pogreška != 0)
printf ("Otkazivanje mapiranja nije uspjelo \ n");
povratak 1;

return 0;

U Primjeru1.c alociramo memoriju pomoću mmap-a. Ovdje smo koristili PROT_READ | PROT_WRITE zaštita za čitanje i pisanje u mapiranu regiju. Koristili smo MAP_PRIVATE | MAP_ANONYMOUS zastava. Koristi se MAP_PRIVATE jer se regija mapiranja ne dijeli s drugim procesima, a koristi se MAP_ANONYMOUS jer ovdje nismo mapirali nijednu datoteku. Iz istog razloga, deskriptor datoteke i ofset vrijednost je postavljena na 0.

Primjer2.c

#include
#include
#include
#include
#include
#include
int glavni (int argc, char * argv [])
ako (argc < 2)
printf ("Put do datoteke nije spomenut \ n");
izlaz (0);

const char * put datoteke = argv [1];
int fd = otvoren (put datoteke, O_RDONLY);
ako (fd < 0)
printf ("\ n \"% s \ ""se ne može otvoriti \ n"",
put datoteke)
Zamijenite svoje tipke miša različito za različiti softver pomoću X-Mouse Button Control
Možda vam treba alat koji bi mogao promijeniti kontrolu miša sa svakom aplikacijom koju koristite. Ako je to slučaj, možete isprobati aplikaciju pod n...
Microsoft Sculpt Touch bežični miš pregled
Nedavno sam čitao o Microsoft Sculpt Touch bežični miš i odlučio ga kupiti. Nakon što sam ga neko vrijeme koristio, odlučio sam s njim podijeliti svoj...
Trackpad i pokazivač miša na ekranu AppyMouse za Windows tablete
Korisnicima tableta često nedostaje pokazivač miša, posebno kada su navični koristiti prijenosna računala. Pametni telefoni i tableti osjetljivi na do...