Fejlécfájl:
#includeSzintaxis:
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; 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)