C Programovanie

Zdieľaná pamäť POSIX s programovaním v jazyku C

Zdieľaná pamäť POSIX s programovaním v jazyku C
Zdieľaná pamäť POSIX je rámec pre medziprocesovú komunikáciu (IPC) špecifikovaný v špecifikáciách POSIX. Dve (alebo viac) úloh z nej môžu čítať a zapisovať do zóny zdieľanej pamäte pri vytváraní zdieľanej pamäte. Zdieľaná pamäť POSIX nie vždy vynúti platby za kopírovanie, na rozdiel od iných štruktúr IPC (napr.g., potrubie, zásuvka atď.) a je žiaduci pre určité programy.

Hovory zdieľanej pamäte POSIX

Funkcie zdieľanej pamäte POSIX sa sústredili na koncept UNIX, že objekt musí byť dokumentom, keď vykonáva vstupno-výstupné činnosti na entite. Pretože teda recitujete a pripisujete entite vzájomnej pamäte POSIX, musí sa táto entita pamäte považovať za dokument. Dokument mapovaný do pamäte je entita zdieľanej pamäte POSIX. Ak chcete použiť shm_open funkcia systémového volania pod / dev / šm, generujú sa samostatné dokumenty zdieľanej pamäte. Systém POSIX poskytuje iba dve vyhradené systémové hovory zdieľanej pamäte, shm_open, a shm_unlink, ktoré úzko súvisia s otváraním a odpájaním hovorov súborového systému. The ftruncate, mmap, a munmapa rámcové volania na dokumenty sa používajú na vykonávanie ďalších úloh v zdieľanej pamäti POSIX. Je potrebné pripojiť program, ktorý využíva volania zdieľanej pamäte POSIX -lrt.

Programy používajúce volania zdieľanej pamäte POSIX musia prejsť nasledujúcimi krokmi:

Použitím shm_open (), tvoria objekt zdieľanej pamäte. Deskriptor dokumentu je možné vrátiť späť, ak je vytvorenie objektu úspešné.

S ftruncate (), veľkosť objektu bude opravená.

S mapa () a MAP_SHARED, vymedzte tento objekt do súčasného adresného priestoru.

Čítanie / zápis do zdieľanej pamäte.

Cez munmap (), zrušíte vymedzenie zdieľanej pamäte.

Použite Zavrieť() uzavrieť objekt.

Skrz shm_unlink (), vymazať objekt v zdieľanej pamäti.

shm_open ()

Ako je opísané vyššie, shm_open () sa používa na generovanie nového objektu zdieľanej pamäte. Sprístupňuje objekt volajúcej procedúre pomocou reverzného deskriptora. Toto je definícia tohto volania funkcie:

>> Int shm_open (const char * name, int oflag, mode_t mode);

Prvý parameter je názov objektu zdieľanej pamäte. Je to reťazec zakončený nulou /názov typu, s podmienkou, že žiadny iný znak nemôže byť lomítko ako jeho prvý znak. Oflag je malý závoj, ktorý bol vytvorený pomocou niekoľkých z predchádzajúcich príznakov pomocou OR-ing, či už prostredníctvom O_RDONLY alebo O_RDWR. Popísané parametre naznačujú, že jeho objekt zdieľanej pamäte musí byť vytvorený (O_CREAT), keď ešte neexistuje, a taktiež je objekt k dispozícii na čítanie a zápis (O_RDWR). Úplne posledný argument nastavuje schválenie adresára pre objekt zdieľanej pamäte.

shm_unlink ()

Shm_unlink () eliminuje predtým vyvinutú entitu zdieľanej pamäte POSIX. Celočíselný deskriptor dokumentu pre objekt zdieľanej pamäte je vrátený prostredníctvom efektívneho volania na shm_open (). Ako je definované pod shm_open (), názov parametra je názov entity zdieľanej pamäte. Nasleduje definícia shm_unlink () funkcia:

>> Int shm_unlink (const char * name);

ftruncate ()

Po nastavení objektu sa zobrazí ftruncate () metóda je nastavená na nastavenie veľkosti entity v bajtoch. Definícia funkcie je nasledovná:

>> Int ftruncate (int fd, off_t length);

Pri konštrukcii zdieľanej pamäte POSIX má skutočne veľkosť kapacity nula bajtov. Entitu zdieľanej pamäte POSIX môžete vykresliť pomocou bajtov s veľkosťou dĺžky cez ftruncate. Ftruncate pri vykonaní dáva nulu. Ftruncate výstupy -1 v prípade poruchy a errno je nastavený na spustenie chyby.

mmap ()

Nakoniec sa dokument mapovaný do pamäte s entitou zdieľanej pamäte nastaví cez mmap () metóda. Potom poskytne ukazovateľ dokumentu namapovaného v pamäti, ktorý sa odloží na dosiahnutie entity zdieľanej pamäte. Nasleduje definícia mmap () funkcia:

>> Void * mmap (void * addr, size_t length, int prot, int flags, int fd, off_t offset);

V tomto prípade je „addr“ adresa, na ktorú bude namapovaná. „Dĺžka“ je rozsah entity zdieľanej pamäte. Hodnoty pre prot sa môžu líšiť, ale použijeme PROT READ | OCHRANNÝ NAPIS. Existuje niekoľko príznakov, ale MAPA ZDIEĽANÁ je pre zdieľanú pamäť nevyhnutná. Teraz je „fd“ deskriptor dokumentu, ktorý bol získaný skôr. Ofset je bod, v ktorom mapovanie začína v entite zdieľanej pamäte; možno použiť aj hodnotu offsetu 0. Po dokončení, mmap () dáva ukazovateľ na polohu mapovania entity zdieľanej pamäte.

munmap ()

Na pozícii smerovanej adresárom a získavajúcej veľkosť, dĺžku, munmapa zruší mapu položky zdieľanej pamäte. Munmap po dokončení poskytne 0 a v prípade nepresnosti -1, v takom prípade je na spustenie chyby priradené errno.

>> Void munmap (void * addr, size_t length);

Príklad: Odosielateľ a príjemca

Zoberme si príklad odosielateľa a príjemcu. Odosielateľ vytvorí nový objekt zdieľanej pamäte s menom / shmem-príklad a prostredníctvom nej vpísať tri číslice do zdieľanej pamäte. Teraz môže prijímač vystaviť objekt zdieľanej pamäte a recitovať tri číslice z pamäte. Vytvoríme tri súbory s menami protokol.h, odosielateľ.c, a prijímač.c.

$ dotykový protokol.h
$ dotykový odosielateľ.c
$ dotykový prijímač.c

Ďalej do protokolu súborov pridáme nižšie uvedený zdrojový kód.h, “odosielateľ.c, „a“ prijímač.c.„Teraz zachránime všetkých a zatvoríme ich.

Teraz zostavíme a pripojíme vyššie uvedený kód pomocou kľúčového slova -lrt zvlášť pre odosielateľa.c a prijímač.c súbor. Tu je príkaz:

$ gcc -o odosielateľ.c -lrt
$ gcc -o prijímač prijímač.c -lrt

Teraz spustíme kód odosielateľa pomocou nasledujúceho príkazu. Výstup je uvedený nižšie.

$ ./ odosielateľ

Pri spustení kódu odosielateľa sa vygeneroval objekt zdieľanej pamäte, ktorý sa nachádza pod ním / dev / šm pomocou nižšie uvedeného príkazu:

$ ls -l / dev / shm | grep shmem-príklad

Keď spustíme kód prijímača, získame výstup nižšie:

$ ./ prijímač

Kedykoľvek funkcia gm_unlink () sa volá pomocou súboru „prijímač“.c, „objekt / dev / shm / shmem-príklad bude oddelený. V takom prípade nezískate na výstupe žiadny objekt, ako je uvedené nižšie.

$ ls -l / dev / shm / shmem-príklad

Záver

V tomto článku ste sa naučili, ako používať zdieľanú pamäť POSIX s programovaním C v Ubuntu 20.04, vrátane všetkých volaní funkcií použitých na vytvorenie zdieľanej pamäte. Dúfam, že vám tento článok pomohol vylepšiť si vedomosti o programovaní a zaoberal sa všetkými pochybnosťami, ktoré v tejto veci máte.

Ako používať Xdotool na stimuláciu kliknutí a stlačenia myši v systéme Linux
Xdotool je bezplatný a otvorený nástroj príkazového riadku na simuláciu kliknutí a stlačenia klávesov myši. Tento článok sa bude týkať stručného sprie...
Top 5 ergonomických produktov pre počítačové myši pre Linux
Spôsobuje dlhodobé používanie počítača bolesť zápästia alebo prstov? Trpíte stuhnutými kĺbmi a neustále si musíte podávať ruky? Cítite pálivú bolesť z...
Ako zmeniť nastavenie myši a touchpadu pomocou systému Xinput v systéme Linux
Väčšina distribúcií systému Linux sa štandardne dodáva s knižnicou „libinput“ na spracovanie vstupných udalostí v systéme. Dokáže spracovať vstupné ud...