C programavimas

POSIX bendra atmintis su C programavimu

POSIX bendra atmintis su C programavimu
POSIX bendroji atmintis yra tarpprocesinio ryšio (IPC) sistema, nurodyta POSIX specifikacijose. Kuriant bendrąją atmintį, iš jo galima nuskaityti dvi (ar daugiau) užduotis ir rašyti į bendrosios atminties zoną. POSIX bendroji atmintis ne visada priverčia išmokėti kopijas, priešingai nei kitos IPC struktūros (pvz.,.g., vamzdis, lizdas ir kt.) ir yra pageidautinas tam tikroms programoms.

„POSIX“ bendrosios atminties skambučiai

POSIX bendrosios atminties funkcijos buvo sutelktos į UNIX koncepciją, kad objektas turi būti dokumentas, kai subjektas atlieka įvesties / išvesties veiklą. Todėl, kadangi jūs skaitote ir prirašote abipusę POSIX atminties esmę, pastaroji turi būti laikoma dokumentu. Atmintyje susietas dokumentas yra POSIX bendrosios atminties objektas. Norėdami naudoti shm_open sistemos iškvietimo funkcija / dev / shm, generuojami atskiri bendros atminties dokumentai. Yra tik du skirti bendrosios atminties sistemos skambučiai iš POSIX, shm_open, ir shm_unlink, kurie yra glaudžiai susiję su failų sistemos skambučių atidarymu ir atsiejimu. The ftruncate, mmap, ir munmap pagrindiniai dokumentų kvietimai naudojami kitoms POSIX bendrosios atminties užduotims atlikti. Būtina prijungti programą, kuriai naudojami POSIX bendrosios atminties skambučiai -lrt.

Programos, naudojančios POSIX bendrosios atminties skambučius, turi atlikti šiuos veiksmus:

Naudojant shm_open (), suformuoti bendros atminties objektą. Dokumento aprašą galima pakeisti, jei objektas suformuotas sėkmingai.

Su ftruncate (), bus nustatytas objekto dydis.

Su žemėlapis () ir MAP_SHARED, apibrėžkite šį objektą dabartinėje adreso erdvėje.

Skaityti / rašyti bendrą atmintį.

Per munmap (), nuimkite bendrą atmintį.

Naudokite Uždaryti() uždaryti objektą.

Per shm_unlink (), ištrinti objektą bendroje atmintyje.

shm_open ()

Kaip aprašyta aukščiau, shm_open () naudojamas generuoti naują bendrosios atminties objektą. Tai suteikia objektui prieinamą iškvietimo procedūrą naudojant grąžintą deskriptorių. Toliau pateiktas šios funkcijos iškvietimo apibrėžimas:

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

Pirmasis parametras yra bendrosios atminties objekto pavadinimas. Tai yra nulinės pabaigos eilutė /vardas tipo, su sąlyga, kad joks kitas simbolis negali būti tik pasvirasis brūkšnys, išskyrus jo pirmąjį simbolį. „Oflag“ yra nedidelis šydas, sukurtas su keliomis ankstesnėmis vėliavomis OR-ing būdu, nesvarbu, ar per O_RDONLY arba O_RDWR. Aprašyti parametrai rodo, kad jo bendrosios atminties objektas turi būti suformuotas (O_CREAT), kai jo dar nėra, o objektą galima skaityti ir rašyti (O_RDWR). Paskutinis argumentas nustato bendrosios atminties objekto katalogų patvirtinimus.

shm_unlink ()

„Shm_unlink“ () pašalina anksčiau sukurtą POSIX bendrosios atminties objektą. Bendrosios atminties objekto dokumento aprašas grąžinamas veiksmingu skambučiu į shm_open (). Kaip apibrėžta po shm_open (), parametro pavadinimas yra bendrosios atminties objekto pavadinimas. Toliau pateikiamas shm_unlink () funkcija:

>> Int shm_unlink (const char * pavadinimas);

ftruncate ()

Nustačius objektą, ftruncate () metodas atmetamas, norint nustatyti objekto dydį baitais. Funkcijos apibrėžimas yra toks:

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

Kuriant bendrą POSIX atmintį, jos talpa iš tikrųjų yra nulis baitų. Galite perteikti POSIX bendrosios atminties objektą naudodami dydžio ilgio baitus sutrumpinti. Sutrumpinti vykdymo metu duoda nulį. Sutrumpinti išveda -1 gedimo atveju ir errno yra nustatytas suaktyvinti klaidą.

mmap ()

Galiausiai atmintyje susietas dokumentas su bendrosios atminties objektu nustatomas per mmap () metodas. Tada gaunamas atmintyje susietas dokumento žymeklis, kuris atmetamas, kad pasiektų bendrosios atminties objektą. Toliau pateikiamas mmap () funkcija:

>> Void * mmap (negaliojantis * addr, dydis_t ilgis, int prot, int vėliavos, int fd, off_t poslinkis);

Čia „addr“ yra adresas, kuriuo jis bus susietas. „Ilgis“ yra bendrosios atminties objekto diapazonas. Prot reikšmės gali skirtis, tačiau mes naudosime PROT READ | PROT RAŠYTI. Yra keletas vėliavų, tačiau MAP SHARED yra būtinas bendrai atminčiai. Dabar „fd“ yra dokumentų aprašas, gautas anksčiau. Poslinkis yra ta vieta, kur prasideda atvaizdavimas bendrosios atminties objekte; taip pat galima naudoti 0 poslinkio vertę. Baigus, mmap () perkelia žymeklį į bendrosios atminties objekto atvaizdavimo padėtį.

munmap ()

Padėtyje, kurią nukreipia addr ir gaunamas dydis, ilgis, munmap atvaizduoja bendrosios atminties elementą. Munmapas duoda 0 baigus ir -1 netikslumo atveju, tokiu atveju klaidai sukelti yra priskirtas errno.

>> Void munmap (negaliojantis * addr, dydis_t ilgis);

Pavyzdys: siuntėjas ir gavėjas

Paimkime siuntėjo ir gavėjo pavyzdį. Siuntėjas sukurs naują bendrosios atminties objektą su pavadinimu / shmem-pavyzdys ir per ją į bendrą atmintį įrašykite tris skaitmenis. Dabar imtuvas gali parodyti bendrosios atminties objektą ir iš atminties nuskaityti tris skaitmenis. Sukursime tris failus su pavadinimais protokolas.h, siuntėjas.c, ir imtuvas.c.

$ touch protokolas.h
$ touch siuntėjas.c
$ jutiklinis imtuvas.c

Tada prie failų protokolo pridėsime žemiau esantį šaltinio kodą.h ", siuntėjas.c, 'ir' imtuvas.c.'Dabar mes išsaugosime visus ir uždarysime juos.

Dabar mes sukursime ir prisijungsime prie pirmiau minėto kodo, naudodami siuntėjui atskirai raktinį žodį -lrt.c ir imtuvas.c failą. Čia yra komanda tai padaryti:

$ gcc -o siuntėjo siuntėjas.c -lrt
$ gcc -o imtuvo imtuvas.c -lrt

Dabar vykdysime siuntėjo kodą naudodami šią komandą. Rezultatas pateiktas žemiau.

$ ./siuntėjas

Vykdant siuntėjo kodą, sugeneruotas bendrosios atminties objektas, kurį galima rasti po juo / dev / shm naudojant žemiau esančią komandą:

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

Paleidus imtuvo kodą, gausime žemiau pateiktą išvestį:

$ ./ imtuvas

Kai tik funkcija gm_unlink () vadinamas failo imtuvu.c “, objektas / dev / shm / shmem-pavyzdys bus atseit. Tokiu atveju išvestyje negausite jokio objekto, kaip parodyta žemiau.

$ ls -l / dev / shm / shmem pavyzdys

Išvada

Šiame straipsnyje jūs sužinojote, kaip naudoti „POSIX Shared Memory“ su C programavimu „Ubuntu 20“.04, įskaitant kiekvieną funkcijų iškvietimą, naudojamą bendrosios atminties sukūrimui. Tikiuosi, kad šis straipsnis padėjo jums tobulinti programavimo žinias ir apėmė visas abejones, kurias turite šia tema.

Pridėkite pelės gestus prie „Windows 10“ naudodami šiuos nemokamus įrankius
Pastaraisiais metais kompiuteriai ir operacinės sistemos labai išsivystė. Buvo laikas, kai vartotojai turėjo naudoti komandas naršydami per failų tvar...
Valdykite ir valdykite pelės judėjimą tarp kelių „Windows 10“ monitorių
„Dual Display Mouse Manager“ leidžia jums valdyti ir konfigūruoti pelės judėjimą tarp kelių monitorių, sulėtinant jo judėjimą šalia sienos. „Windows 1...
„WinMouse“ leidžia tinkinti ir pagerinti pelės žymeklio judėjimą „Windows“ kompiuteryje
Jei norite pagerinti numatytąsias pelės žymiklio funkcijas, naudokite nemokamą programinę įrangą „WinMouse“. Tai prideda daugiau funkcijų, kurios padė...