C Programiranje

POSIX skupni pomnilnik s programiranjem C

POSIX skupni pomnilnik s programiranjem C
Skupni pomnilnik POSIX je okvir za medprocesno komunikacijo (IPC), določen v specifikacijah POSIX. Dve (ali več) nalogi lahko bereta iz nje in pišeta v skupno pomnilniško območje, medtem ko vzpostavljata skupni pomnilnik. Skupni pomnilnik POSIX ne izvaja vedno izplačil kopij, v nasprotju z drugimi strukturami IPC (npr.g., cev, vtičnica itd.) in je zaželena za nekatere programe.

Klici v skupni pomnilnik POSIX

Funkcije skupnega pomnilnika POSIX so se osredotočale na koncept UNIX, da mora biti objekt pri izvajanju vhodno / izhodnih dejavnosti na entiteti dokument. Ker torej recitirate in vpišete vzajemno enoto pomnilnika POSIX, jo je treba obravnavati kot dokument. Pomnilniško preslikan dokument je entiteta skupnega pomnilnika POSIX. Za uporabo shm_open funkcija sistemskega klica spodaj / dev / shm, ustvarijo se ločeni dokumenti v skupnem pomnilniku. Iz sistema POSIX obstajata le dva namenska sistemska klica v skupnem pomnilniku, shm_open, in shm_unlink, ki so tesno povezani z odpiranjem in prekinitvijo povezave klicev datotečnega sistema. The ftruncate, mmap, in munmap Okvirni klici za dokumente se uporabljajo za izvajanje drugih nalog v skupnem pomnilniku POSIX. Treba je povezati program, ki uporablja POSIX klice v skupnem pomnilniku -lrt.

Programi, ki uporabljajo klice skupnega pomnilnika POSIX, morajo opraviti naslednje korake:

Uporaba shm_open (), tvorijo predmet skupnega pomnilnika. Če je oblikovanje predmeta uspešno, je mogoče deskriptor dokumenta razveljaviti.

S ftruncate (), velikost predmeta bo določena.

S zemljevid() in MAP_SHARED, razmeji ta predmet v sedanji naslovni prostor.

Branje / pisanje skupnega pomnilnika.

Preko munmap (), loči skupni pomnilnik.

Uporaba zapri () da zaprete predmet.

Skozi shm_unlink (), izbriši predmet v skupnem pomnilniku.

shm_open ()

Kot je opisano zgoraj, shm_open () se uporablja za ustvarjanje novega predmeta skupnega pomnilnika. Objekt omogoča dostop do klicnega postopka z uporabo obrnjenega deskriptorja. Sledi definicija tega klica funkcije:

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

Prvi parameter je ime predmeta v skupni rabi. Je ničelno zaključen niz datoteke / ime tipa, z določbo, da noben drug znak ne sme biti poševnica razen prvega znaka. Oflag je majhna tančica, ki jo ustvari OR-ing z več prejšnjimi zastavicami, bodisi prek O_RDONLY ali O_RDWR. Opisani parametri kažejo, da je treba njegov objekt v skupnem pomnilniku oblikovati (O_CREAT), če še ne obstaja in je tudi objekt na voljo za branje in pisanje (O_RDWR). Zadnji argument nastavi odobritve imenika za objekt v skupnem pomnilniku.

shm_unlink ()

Shm_unlink () odpravlja entiteto skupnega pomnilnika POSIX, ki je bila prej razvita. Deskriptor celoštevilčnega dokumenta za objekt v skupnem pomnilniku se vrne z učinkovitim klicem na shm_open (). Kot je opredeljeno pod shm_open (), ime parametra je naslov entitete skupnega pomnilnika. Sledi opredelitev shm_unlink () funkcija:

>> Int shm_unlink (const char * ime);

ftruncate ()

Po nastavitvi predmeta se ftruncate () metoda se izloči, da se v bajtih nastavi velikost entitete. Definicija funkcije je naslednja:

>> Int ftruncate (int fd, dolžina_t_t);

Pri izdelavi skupnega pomnilnika POSIX je njegova velikost dejansko nič bajtov. Entiteto skupnega pomnilnika POSIX lahko upodobite z bajti velikosti ftruncate. Ftruncate daje nič pri izvedbi. Ftruncate izhodi -1 v primeru okvare in errno je nastavljen tako, da sproži napako.

mmap ()

Sčasoma se s pomočjo datoteke nastavi pomnilniško preslikani dokument z entiteto v skupnem pomnilniku mmap () metoda. Nato prikaže pomnilniško preslikani kazalec dokumenta, ki se odvrže, da doseže entiteto v skupnem pomnilniku. Sledi opredelitev mmap () funkcija:

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

V tem je "addr" naslov, na katerega bo preslikan. 'Dolžina' je obseg entitete skupnega pomnilnika. Vrednosti za prot se lahko razlikujejo, vendar bomo uporabili PROT READ | PROT PIŠI. Obstaja več zastavic, vendar je MAP SHARED bistvenega pomena za skupni pomnilnik. Zdaj je 'fd' deskriptor dokumenta, ki je bil pridobljen prej. Odmik je točka, kjer se preslikava začne v entiteti skupnega pomnilnika; lahko se uporabi tudi vrednost odmika 0. Po zaključku, mmap () daje kazalec na položaj preslikave entitete skupne pomnilniške enote.

munmap ()

Na položaju, ki ga usmerja addr in pridobivanje velikosti, dolžine, munmap odstrani element skupnega pomnilnika. Munmap po zaključku da 0, v primeru netočnosti pa -1, v tem primeru se za sprožitev napake dodeli errno.

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

Primer: Pošiljatelj in prejemnik

Vzemimo primer pošiljatelja in prejemnika. Pošiljatelj bo ustvaril nov predmet v skupnem pomnilniku z imenom / shmem-primer in prek njega v skupni pomnilnik vpišite tri številke. Zdaj lahko sprejemnik izpostavi predmet skupnega pomnilnika in iz spomina recitira tri številke. Ustvarili bomo tri datoteke z imeni protokola.h, pošiljatelj.c, in sprejemnik.c.

$ touch protokol.h
$ pošiljatelj na dotik.c
$ touch sprejemnik.c

Nato bomo v protokol datotek dodali spodnjo izvorno kodo.h, "pošiljatelj.c, 'in' sprejemnik.c.'Zdaj bomo rešili vse in jih zaprli.

Zdaj bomo zgornjo kodo sestavili in pridružili z uporabo ključne besede -lrt posebej za pošiljatelja.c in sprejemnik.c datoteko. Tukaj je ukaz za to:

$ gcc -o pošiljatelj pošiljatelj.c -lrt
$ gcc -o sprejemnik sprejemnika.c -lrt

Zdaj bomo kodo pošiljatelja zagnali z naslednjim ukazom. Rezultat je podan spodaj.

$ ./ pošiljatelj

Z zagonom kode pošiljatelja je bil ustvarjen objekt v skupni rabi in ga je mogoče najti spodaj / dev / shm z uporabo spodnjega ukaza:

$ ls -l / dev / shm | grep shmem-primer

Ko zaženemo kodo sprejemnika, bomo dobili spodnji izhod:

$ ./ sprejemnik

Kadarkoli je funkcija gm_unlink () se pokliče s pomočjo sprejemnika datoteke.c, 'predmet / dev / shm / shmem-primer bo ločeno. V tem primeru na izhodu ne boste dobili nobenega predmeta, kot je prikazano spodaj.

$ ls -l / dev / shm / shmem-primer

Zaključek

V tem članku ste se naučili, kako uporabljati pomnilnik v skupni rabi POSIX s programiranjem C v Ubuntu 20.04, vključno z vsemi funkcijskimi klici, uporabljenimi za vzpostavitev skupnega pomnilnika. Upam, da vam je ta članek pomagal izboljšati znanje programiranja in zajemal vse dvome o tej temi.

10 najboljših iger za igranje v Ubuntuju
Platforma Windows je bila ena izmed prevladujočih platform za igre na srečo zaradi velikega odstotka iger, ki se danes razvijajo za naravno podporo si...
5 najboljših arkadnih iger za Linux
Dandanes so računalniki resni stroji, ki se uporabljajo za igre na srečo. Če ne boste mogli dobiti novega visokega rezultata, boste vedeli, kaj mislim...
Bitka za Wesnoth 1.13.6 Razvoj izdan
Bitka za Wesnoth 1.13.6, ki je izšel prejšnji mesec, je šesta razvojna izdaja v 1.13.x series in prinaša številne izboljšave, predvsem uporabniški vme...