C Programmeerimine

C-programmeerimisega ühismälu POSIX

C-programmeerimisega ühismälu POSIX
POSIXi ühismälu on protsessidevahelise suhtluse (IPC) raamistik, mis on määratletud POSIXi spetsifikatsioonides. Kaks (või enam) ülesannet saavad sellest lugeda ja ühismälu loomisel ühisesse mälutsooni kirjutada. POSIXi ühismälu ei sunni alati koopiate väljamakseid tegema, vastupidiselt teistele IPC struktuuridele (nt.g., toru, pistikupesa jne.) ja on soovitav teatud programmide jaoks.

POSIXi ühismälukõned

POSIX-i ühismälufunktsioonid keskendusid UNIX-i kontseptsioonile, mille kohaselt objekt peab olema üksusena sisend- / väljundtegevuste teostamisel dokument. Seetõttu, kuna loete ja kirjutate sisse vastastikuse POSIX-mäluüksuse, tuleb viimast käsitleda dokumendina. Mäluga kaardistatud dokument on POSIX-i jagatud mälu üksus. Kasutamiseks shm_open süsteemikõne funktsioon all / dev / shm, genereeritakse eraldi ühismäludokumendid. POSIX-ist on ainult kaks spetsiaalset ühismälusüsteemi kõnet, shm_open, ja shm_unlink, mis on tihedalt seotud failisüsteemi kõnede avamise ja lahtiühendamisega. The ftruncate, mmap, ja munmap raamdokumentide väljakutseid kasutatakse POSIXi ühismälus muude ülesannete täitmiseks. On vaja ühendada programm, mis kasutab POSIXi ühismälukõnesid -lrt.

POSIXi ühismälukõnesid kasutavad programmid peavad läbima järgmised sammud:

Kasutamine shm_open (), moodustavad jagatud mäluobjekti. Dokumendi kirjeldaja saab tagasi pöörata, kui objekti moodustamine on edukas.

Koos ftruncate (), fikseeritakse objekti suurus.

Koos kaart () ja MAP_SHARED, piiritlege see objekt praegusesse aadressiruumi.

Ühismälu lugemine / kirjutamine.

Via kaudu munmap (), tühistage jagatud mälu piiritlemine.

Kasutage Sulge() objekti sulgemiseks.

Läbi shm_unlink (), kustutage objekt ühismälust.

shm_open ()

Nagu eespool kirjeldatud, shm_open () kasutatakse uue jagatud mälu objekti genereerimiseks. See muudab objekti helistamisprotseduurile juurdepääsetavaks, kasutades tagasipööratud kirjeldust. Selle funktsioonikõne määratlus on järgmine:

>> Int shm_open (const char * nimi, int oflag, mode_t režiim);

Esimene parameeter on jagatud mäluobjekti nimi. See on nulliga lõpetatud string / nimi tüüp, tingimusel, et ükski teine ​​märk ei saa olla kaldkriips peale selle esimese tähemärgi. Oflag on väike loor, mis on loodud mitme eelneva lipuga OR-ing abil, kas siis läbi O_RDONLY või O_RDWR. Kirjeldatud parameetrid näitavad, et selle jagatud mälu objekt tuleb moodustada (O_CREAT), kui seda veel pole ja objekt on ka lugemiseks ja kirjutamiseks saadaval (O_RDWR). Viimane argument määrab jagatud mälu objekti kataloogide kinnitused.

shm_unlink ()

Shm_unlink () kõrvaldab varem välja töötatud ühismälu POSIX. Jagatud mälu objekti täisarvudokumentide kirjeldus tagastatakse tõhusa kõne kaudu aadressile shm_open (). Nagu on määratletud all shm_open (), parameetri nimi on jagatud mälu üksuse pealkiri. Järgmine on shm_unlink () funktsioon:

>> Int shm_unlink (const char * nimi);

ftruncate ()

Objekti seadistamisel ftruncate () meetod eraldatakse üksuse suuruse baitides seadistamiseks. Funktsiooni määratlus on järgmine:

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

Jagatud POSIX-mälu ehitamisel on selle maht mahult null baiti. POSIXi jagatud mäluüksuse saate renderdada suurusega baitidega ftruncate. Lülita annab täitmisel nulli. Lülita väljundid -1 rikke korral ja errno on määratud vea käivitama.

mmap ()

Lõpuks määratakse mälu abil kaardistatud dokument jagatud mälu üksusega mmap () meetod. Seejärel saadakse mäluga kaardistatud dokumendikursor, mis eraldatakse jagatud mälu üksuseni jõudmiseks. Järgmine on mmap () funktsioon:

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

Selles on 'addr' aadress, kuhu see kaardistatakse. "Pikkus" on jagatud mäluüksuse vahemik. Prot väärtused võivad erineda, kuid me kasutame PROT READ | PROT KIRJUTA. Lippe on mitu, kuid MAP SHARED on jagatud mälu jaoks hädavajalik. Nüüd on 'fd' varem saadud dokumendikirjeldus. Nihe on punkt, kus kaardistamine algab jagatud mälu üksuses; saab kasutada ka 0 nihke väärtust. Lõpetamisel, mmap () viib kursori jagatud mäluüksuse kaardistusasendisse.

munmap ()

Aadressil, mille on suunanud addr ja mille suurus, pikkus, munmap tühistab jagatud mälu üksuse. Munmap annab lõpetamisel 0 ja ebatäpsuse korral -1, sel juhul määratakse vea käivitamiseks errno.

>> tühine munmap (tühine * addr, suurus_t pikkus);

Näide: saatja ja vastuvõtja

Võtame näiteks saatja ja vastuvõtja. Saatja loob uue nimega ühismäluobjekti / shmem-näide ja sisestage selle kaudu jagatud mällu kolm numbrit. Nüüd võib vastuvõtja paljastada jagatud mälu objekti ja lugeda kolm numbrit mälust. Loome kolm faili nimedega protokoll.h, saatja.c, ja vastuvõtja.c.

$ touch -protokoll.h
$ touch saatja.c
$ puutetundlik vastuvõtja.c

Järgmisena lisame allpool oleva lähtekoodi failide protokolli.h, "saatja.c, 'ja' vastuvõtja.c."Nüüd päästame kõik ja sulgeme nad.

Nüüd koostame ja ühendame ülaltoodud koodi, kasutades saatjale eraldi märksõna -lrt.c ja vastuvõtja.c fail. Siin on käsk seda teha:

Saatja saatja $ gcc -o.c -lrt
$ gcc -o vastuvõtja.c -lrt

Nüüd käivitame saatja koodi järgmise käsu abil. Väljund on toodud allpool.

$ ./ saatja

Saatja koodi käivitamisel on jagatud mäluobjekt loodud ja selle leiate selle alt / dev / shm kasutades järgmist käsku:

$ ls -l / dev / shm | grep shmem-näide

Vastuvõtja koodi käivitamisel saame järgmise väljundi:

$ ./ vastuvõtja

Alati, kui funktsioon gm_unlink () nimetatakse faili vastuvõtja abil.c, 'objekt / dev / shm / shmem-näide eraldatakse. Sellisel juhul ei saa te väljundil ühtegi objekti, nagu allpool näidatud.

$ ls -l / dev / shm / shmem-näide

Järeldus

Selles artiklis õppisite, kuidas Ubuntu 20-s kasutada C-programmeerimisega POSIXi ühismälu.04, sealhulgas kõik jagatud mälu loomiseks kasutatud funktsioonikõned. Loodan, et see artikkel aitas teil programmeerimisalaseid teadmisi täiendada ja hõlmas kõiki kahtlusi, mis teil sel teemal on.

Parimad Oculus App Lab mängud
Kui olete Oculuse peakomplekti omanik, peate olema teadlik külglaadimisest. Kõrvalaadimine on protsess, millega installitakse peakomplekti mitte-poesi...
10 parimat mängu, mida Ubuntu kaudu mängida
Windowsi platvorm on olnud üks mängude domineerivaid platvorme, kuna tohutu protsent mänge areneb täna Windowsi loomupäraseks toetamiseks. Kas keegi s...
5 parimat arkaadmängu Linuxile
Tänapäeval on arvutid tõsised mängimiseks kasutatavad masinad. Kui te ei saa uut rekordit, teate, mida ma mõtlen. Selles postituses saate teada mõnda ...