C programozás

POSIX megosztott memória C programozással

POSIX megosztott memória C programozással
A POSIX megosztott memória a folyamatok közötti kommunikáció (IPC) kerete, amelyet a POSIX specifikációi határoznak meg. Két (vagy több) feladat olvashat róla és írhat a megosztott memória zónába, miközben létrehozza a megosztott memóriát. A POSIX megosztott memória nem mindig hajtja végre a másolás folyósítását, ellentétben a többi IPC struktúrával (pl.g., cső, aljzat stb.), és bizonyos programok esetében kívánatos.

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.

OpenTTD bemutató
Az OpenTTD az egyik legnépszerűbb üzleti szimulációs játék. Ebben a játékban létre kell hoznia egy csodálatos szállítási vállalkozást. Azonban kezdete...
SuperTuxKart Linuxhoz
A SuperTuxKart egy nagyszerű cím, amelynek célja, hogy ingyenesen hozza el a Mario Kart élményét Linux rendszerén. Elég kihívást jelentő és szórakozta...
Csata a Wesnoth bemutatóért
A Battle for Wesnoth az egyik legnépszerűbb nyílt forráskódú stratégiai játék, amelyet jelenleg játszhatsz. Ez a játék nem csak nagyon hosszú ideje fe...