POSIX megosztott memória hívások
A POSIX megosztott memória funkciók arra a UNIX koncepcióra összpontosítottak, hogy az objektumnak dokumentumnak kell lennie, amikor egy entitáson be- és kimeneti tevékenységeket végeznek. Ezért, mivel felolvas és felír egy közös POSIX memória entitást, az utóbbit dokumentumnak kell tekinteni. A memóriában leképezett dokumentum egy POSIX megosztott memória entitás. A shm_open rendszerhívás funkció alatt / dev / shm, külön megosztott memória dokumentumok készülnek. Csak két dedikált megosztott memóriarendszer-hívás van a POSIX-ból, shm_open, és shm_unlink, amelyek szorosan kapcsolódnak a fájlrendszeres hívások megnyitásához és leválasztásához. A ftruncate, mmap, és munmap A dokumentumok keretrendszer-felhívásait más feladatok végrehajtására használják a POSIX megosztott memóriáján. Olyan programot kell csatlakoztatni, amely POSIX megosztott memória hívásokat használ -lrt.
A POSIX megosztott memória hívásokat használó programoknak a következő lépéseket kell végrehajtaniuk:
Használata shm_open (), közös memóriaobjektumot alkotnak. A dokumentumleíró visszavonható, ha az objektum kialakítása sikeres.
Val vel ftruncate (), az objektum mérete rögzítésre kerül.
Val vel térkép() és MAP_SHARED, határozza meg ezt az objektumot a jelenlegi címtérbe.
A megosztott memória olvasása / írása.
Keresztül munmap (), vonja le a megosztott memóriát.
Használat Bezárás() hogy bezárja az objektumot.
Keresztül shm_unlink (), törölje az objektumot a megosztott memóriából.
shm_open ()
A fent leírtak szerint, shm_open () új megosztott memória objektum létrehozására szolgál. Hozzáférhetővé teszi az objektumot a visszahívott leíró segítségével a hívási eljárás számára. A következő a függvényhívás meghatározása:
>> Int shm_open (const char * név, int oflag, mode_t mód);Az első paraméter a megosztott memóriaobjektum neve. Ez egy null-végű karakterlánc a /név típusú, azzal a kikötéssel, hogy az első karakterén kívül más karakter nem lehet perjel. Az Oflag egy kis fátyol, amelyet az előző zászlók többségével OR-ingeléssel hoztak létre, akár vian keresztül O_RDONLY vagy O_RDWR. A leírt paraméterek azt jelzik, hogy a megosztott memóriájú objektumot akkor kell kialakítani (O_CREAT), amikor még nem létezik, és az objektum elérhető olvasásra és írásra (O_RDWR). A legutolsó argumentum megadja a megosztott memória objektum könyvtár jóváhagyásait.
shm_unlink ()
Shm_unlink () kiküszöböli a korábban kifejlesztett POSIX megosztott memória entitást. A megosztott memória objektum egész dokumentumleíróját hatékony hívással küldjük vissza a következő címre: shm_open (). A shm_open (), a paraméter neve a megosztott memória entitás címe. Az alábbiakban a shm_unlink () funkció:
>> Int shm_unlink (const char * név);ftruncate ()
Az objektum beállításakor a ftruncate () metódus kerül leadásra az entitás méretének bájtokban történő beállításához. A függvény meghatározása a következő:
>> Int ftruncate (int fd, off_t hossz);Megosztott POSIX memória létrehozásakor valóban nulla bájt méretű. A POSIX megosztott memória entitást méretbájt hosszúságú bájtokkal jelenítheti meg ftruncate. Ftruncate a végrehajtáskor nulla. Ftruncate kimenet -1 meghibásodás esetén és errno a hiba kiváltására van beállítva.
mmap ()
Végül a memóriában leképezett dokumentumot a megosztott memória entitással a mmap () módszer. Ezután kap egy memóriában leképezett dokumentummutatót, amelyet leadva eljut a megosztott memória entitáshoz. Az alábbiakban a mmap () funkció:
>> Void * mmap (void * addr, size_t length, int prot, int flags, int fd, off_t offset);Ebben az 'addr' az a cím, amelyre hozzárendelik. A „hossz” a megosztott memória entitás tartománya. A prot értékei eltérhetnek, de a PROT READ | -ot fogjuk használni PROT WRITE. Több zászló létezik, de a MAP SHARED elengedhetetlen a megosztott memória számára. Az 'fd' egy korábban leírt dokumentumleíró. Az eltolás az a pont, ahol a leképezés megkezdődik a megosztott memória entitásban; a 0 eltolás értéke is használható. Befejezéskor, mmap () a mutatót a megosztott memória entitás leképezési pozíciójához adja.
munmap ()
Az addr által irányított helyzetben és méretben, hosszban, munmap feloldja a megosztott memória elemét. Munmap 0-t eredményez a befejezéskor, -1-et pedig pontatlanság esetén, ebben az esetben az errno-t hozzárendelik a hiba kiváltásához.
>> Void munmap (void * addr, size_t length);Példa: Feladó és fogadó
Vegyük a feladó és a vevő példáját. A feladó új megosztott memória objektumot hoz létre a névvel / shmem-példa és azon keresztül írjon be három számot a megosztott memóriába. Most a vevő feltárhatja a megosztott memória objektumot, és elmondhatja a memóriából a három számot. Három fájlt hozunk létre a nevekkel jegyzőkönyv.h, küldő.c, és vevő.c.
$ touch protokoll.h$ touch küldő.c
$ érintõ vevõ.c
Ezután hozzáadjuk az alábbi forráskódot a fájlok protokolljához.h "küldő.c, 'és' vevő.c.- Most mindet megmentjük és bezárjuk.
Most összeállítjuk és összekapcsoljuk a fenti kódot a -lrt kulcsszó használatával, külön a feladó számára.c és vevő.c fájl. Itt van a parancs erre:
$ gcc -o küldő küldő.c -lrt$ gcc -o vevő vevő.c -lrt
Most a következő paranccsal futtatjuk a feladó kódját. A kimenetet az alábbiakban adjuk meg.
$ ./feladó
A feladó kód futtatásával létrehozták a megosztott memória objektumot, amely megtalálható alatta / dev / shm az alábbi paranccsal:
$ ls -l / dev / shm | grep shmem-példa
A vevő kód futtatásakor az alábbi kimenetet kapjuk:
$ ./ vevő
Bármikor a funkció gm_unlink () a 'vevő fájl segítségével hívjuk meg.c, 'az objektum / dev / shm / shmem-példa leválik. Ebben az esetben nem kap objektumot a kimeneten, az alábbiak szerint.
$ ls -l / dev / shm / shmem-példa
Következtetés
Ebben a cikkben megtanulta, hogyan kell használni a POSIX megosztott memóriát C programozással az Ubuntu 20-ban.04, beleértve a megosztott memória létrehozásához használt összes funkcióhívást. Remélem, hogy ez a cikk segített a programozási ismeretek fejlesztésében, és minden kétséget felvetett e témával kapcsolatban.