„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.