C programozás

Az mmap függvény használata C nyelven?

Az mmap függvény használata C nyelven?
A mmap () függvény a folyamat címterének és fájlok vagy eszközök közötti leképezésre szolgál. Ha egy fájlt hozzárendel egy folyamat címteréhez, a fájl tömbként érhető el a programban. Ez az egyik leghatékonyabb módszer a fájlban lévő adatok elérésére, és zökkenőmentes kódolási felületet biztosít, amely természetes egy olyan adatstruktúra számára, amelyet ki lehet értékelni anélkül, hogy absztrakt lenne az olvasás és írás a fájlokból. Ebben a cikkben megvitatjuk a mmap () funkció Linux alatt. Tehát kezdjük.

Fejlécfájl:

#include

Szintaxis:

void * mmap (void * cím, méret_t hossz, int védelem, int zászlók, int fájlok,
off_t offset)

Érvek:

A függvénynek 6 argumentuma van:

1. cím:

Ez az argumentum egy előnyös kezdőcímet ad meg a leképezéshez. Ha nem létezik másik leképezés, akkor a kern kiválaszt egy közeli oldalhatárt, és létrehozza a leképezést; különben a kernel új címet választ. Ha ez az argumentum NULL, akkor a kern bárhová elhelyezheti a leképezést.

2. hossz:

Ez a leképezendő bájtok száma.

3. védelem:

Ezzel az érvvel szabályozhatjuk, hogy milyen típusú hozzáférés engedélyezett. Ez az argumentum logikus „OR” lehet a következő jelölők közül PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE.  Az olvasás, írás és végrehajtás hozzáférési típusai a tartalom engedélyei.

4. zászlók:

Ezt az érvet használják a térkép jellegének szabályozására. Az alábbiakban bemutatjuk a zászlók néhány közös értékét:

  • MAP_SHARED: Ezt a zászlót használják a leképezés megosztásához az összes többi folyamattal, amely ehhez az objektumhoz van leképezve. A leképezési régióban végrehajtott módosítások visszaíródnak a fájlba.
  • MAP_PRIVATE: Ha ezt a jelzőt használja, a leképezést más folyamatok nem láthatják, és a végrehajtott módosításokat nem írja be a fájlba.
  • MAP_ANONYMOUS / TÉRKÉP_ANON: Ez a zászló névtelen leképezés létrehozására szolgál. Az anonim leképezés azt jelenti, hogy a leképezés nem kapcsolódik egyetlen fájlhoz sem. Ezt a leképezést használjuk primitívként a kupac meghosszabbításához.
  • MAP_FIXED: Ha ezt a jelzőt használják, a rendszert arra kell kényszeríteni, hogy használja a cím Ha ez nem lehetséges, akkor a leképezés sikertelen lesz.

5. fájlok:

Ezt a fájlleírót kell feltérképezni.

6. ellentételezés:

Ezt ellensúlyozza a fájlok leképezésének kezdete. Egyszerűbben fogalmazva: a leképezés kapcsolódik a (ellentételezés) nak nek (eltolás + hossz-1) bájt a fájl megnyitásakor filedes leíró.

Visszatérési értékek:

A sikeren a mmap () 0-t ad vissza; meghibásodás esetén a függvény visszaadja a MAP_FAILED értéket.

Képileg a térképfüggvényt a következőképpen ábrázolhatjuk:

A feltérképezett régió feloldásához munmap () függvényt használjuk:

Szintaxis:

int munmap(érvénytelen *cím, méret_t hossz);

Visszatérési értékek:

A sikeren a munmap () 0-t ad vissza; meghibásodás esetén a függvény -1-et ad vissza.

Példák:

Most látunk egy példa programot az alábbiakhoz az mmap () rendszerhívással:

  • Memória allokáció (példa.c)
  • Fájl olvasása (2. példa.c)
  • Fájl írása (3. példa.c)
  • Folyamatközi kommunikáció (4. példa.c)

1. példa.c

#include
#include
int main ()
int N = 5; // A tömb elemeinek száma
int * ptr = mmap (NULL, N * (int) mérete,
PROT_READ | PROT_WRITE,
MAP_PRIVATE | TÉRKÉP_ANONYMOS,
0, 0);
ha (ptr == TÉRKÉPESSÉG)
printf ("Sikertelen hozzárendelés \ n");
return 1;

// Töltse ki a tömb elemeit
for (int i = 0; i ");
mert (int i = 0; iprintf ("[% d]", ptr [i]);

printf ("\ n");
int err = munmap (ptr, 10 * sizeof (int));
ha (tévedés != 0)
printf ("Sikertelen feloldás \ n");
return 1;

visszatér 0;

Az 1. példában.c memóriát osztunk ki az mmap segítségével. Itt a PROT_READ | -ot használtuk PROT_WRITE védelem a leképezett régióba történő olvasáshoz és íráshoz. A MAP_PRIVATE | MAP_ANONYMOUS zászló. A MAP_PRIVATE-t azért használják, mert a leképezési régiót nem osztják meg más folyamatokkal, és a MAP_ANONYMOUS-t azért használják, mert itt még egyetlen fájlt sem térképeztünk fel. Ugyanezen okból a fájlleíró és a ellentételezés értéke 0.

2. példa.c

#include
#include
#include
#include
#include
#include
int main (int argc, char * argv [])
ha (argc < 2)
printf ("A fájl elérési útja nincs megadva \ n");
kilépés (0);

const char * filepath = argv [1];
int fd = nyitva (filepath, O_RDONLY);
ha (fd < 0)
printf ("\ n \"% s \ ""nem nyitható meg \ n"",
fájl elérési út)
Microsoft Sculpt Touch vezeték nélküli egér áttekintés
Nemrég olvastam a Microsoft Sculpt Touch vezeték nélküli egér és úgy döntött, hogy megveszi. Egy ideig használat után úgy döntöttem, hogy megosztom ve...
AppyMouse képernyős Trackpad és egérmutató a Windows táblagépekhez
A táblagép-felhasználók gyakran hiányolják az egérmutatót, különösen akkor, ha szokták használni a laptopokat. Az érintőképernyős okostelefonok és táb...
Az egér középső gombja nem működik a Windows 10 rendszerben
A középső egérgomb segít átgörgetni a hosszú weboldalakat és a sok adatot tartalmazó képernyőket. Ha ez leáll, akkor a billentyűzet segítségével görge...