Pozivi s dijeljenom memorijom POSIX
POSIX funkcije dijeljene memorije fokusirale su se na UNIX koncept da objekt mora biti dokument prilikom izvođenja ulazno / izlaznih aktivnosti na entitetu. Stoga, budući da recitirate i upisujete uzajamni POSIX memorijski entitet, potonji se mora smatrati dokumentom. Dokument mapiran u memoriju je POSIX entitet dijeljene memorije. Da biste koristili shm_open funkcija sistemskog poziva ispod / dev / shm, generiraju se zasebni dokumenti dijeljene memorije. Postoje samo dva namjenska sistemska poziva dijeljene memorije s POSIX-a, shm_open, i shm_unlink, koji su usko povezani s otvaranjem i prekidanjem veze sistemskih poziva datoteka. The ftruncate, mmap, i munmap okvirni pozivi za dokumente koriste se za obavljanje drugih zadataka na dijeljenoj memoriji POSIX. Potrebno je povezati program koji koristi POSIX pozive iz dijeljene memorije -lrt.
Programi koji koriste pozive dijeljene memorije POSIX moraju proći sljedeće korake:
Koristeći shm_open (), tvore objekt zajedničke memorije. Deskriptor dokumenta može se vratiti ako je oblikovanje objekta uspješno.
S ftruncate (), veličina predmeta bit će fiksna.
S karta() i KARTA_DIJELJENA, razgraniči ovaj objekt u trenutni adresni prostor.
Čitanje / pisanje zajedničke memorije.
Preko karta (), razdvojiti zajedničku memoriju.
Koristiti Zatvoriti() zatvoriti objekt.
Kroz shm_unlink (), izbrišite objekt u zajedničkoj memoriji.
shm_open ()
Kao što je gore opisano, shm_open () koristi se za generiranje novog objekta dijeljene memorije. Omogućuje objekt pristupu pozivajućem postupku pomoću vraćenog deskriptora. Slijedi definicija ovog poziva funkcije:
>> Int shm_open (naziv const char *, int oflag, mode_t mode);Prvi parametar je ime objekta zajedničke memorije. To je nula-završeni niz datoteke /Ime tipa, uz uvjet da nijedan drugi znak ne može biti kosa crta osim njegovog prvog znaka. Oflag je mali veo stvoren s nekoliko prethodnih zastavica OR-ing-om, bilo putem O_RDONLY ili O_RDWR. Opisani parametri pokazuju da njegov objekt zajedničke memorije mora biti formiran (O_CREAT) kada već ne postoji, a objekt je dostupan i za čitanje i pisanje (O_RDWR). Posljednji argument postavlja odobrenja direktorija za objekt dijeljene memorije.
shm_unlink ()
Shm_unlink () eliminira POSIX zajedničku memoriju koja je ranije bila razvijena. Deskriptor cjelobrojnog dokumenta za objekt dijeljene memorije vraća se učinkovitim pozivom na shm_open (). Kao što je definirano ispod shm_open (), naziv parametra je naslov entiteta dijeljene memorije. Slijedi definicija shm_unlink () funkcija:
>> Int shm_unlink (naziv const char *);ftruncate ()
Nakon postavljanja objekta, ftruncate () metoda se odbacuje za postavljanje veličine entiteta u bajtovima. Definicija funkcije je sljedeća:
>> Int ftruncate (int fd, dužina_t_t);Kada se konstruira zajednička POSIX memorija, ona doista iznosi nula bajtova. Možete prikazati POSIX entitet dijeljene memorije s bajtovima veličine duljine putem ftruncate. Ftruncate daje nula na izvršenju. Ftruncate izlazi -1 u slučaju kvara i errno je postavljen tako da pokreće pogrešku.
mmap ()
Na kraju se putem mape postavlja dokument mapiran u memoriju s entitetom dijeljene memorije mmap () metoda. Zatim daje memorirani mapirani pokazivač dokumenta koji se odbacuje da bi se dostigao entitet dijeljene memorije. Slijedi definicija mmap () funkcija:
>> Void * mmap (void * addr, size_t length, int prot, int flags, int fd, off_t offset);U tome je 'addr' adresa na koju će se preslikati. 'Duljina' je raspon entiteta dijeljene memorije. Vrijednosti za prot mogu se razlikovati, ali mi ćemo koristiti PROT READ | PROT PIŠI. Postoji nekoliko zastavica, ali MAP SHARED je presudan za zajedničku memoriju. Sada je 'fd' deskriptor dokumenta koji je dobiven ranije. Pomak je točka u kojoj mapiranje započinje u entitetu dijeljene memorije; može se koristiti i vrijednost pomaka 0. Po završetku, mmap () daje pokazivač na položaj mapiranja entiteta dijeljene memorije.
munmap ()
Na poziciji koju usmjerava addr i dobivanje veličine, dužine, munmap odslikava stavku dijeljene memorije. Munmap daje 0 nakon završetka i -1 u slučaju netočnosti, u tom se slučaju dodjeljuje errno za pokretanje pogreške.
>> Void munmap (void * addr, size_t length);Primjer: pošiljatelj i primatelj
Uzmimo primjer pošiljatelja i primatelja. Pošiljatelj će stvoriti novi objekt dijeljene memorije s imenom / shmem-primjer i kroz nju upišite tri broja u zajedničku memoriju. Sada prijemnik može izložiti objekt dijeljene memorije i izgovoriti tri brojeva iz memorije. Stvorit ćemo tri datoteke s imenima protokol.h, pošiljatelj.c, i prijamnik.c.
$ touch protokol.h$ dodirni pošiljatelj.c
$ touch prijemnik.c
Dalje ćemo dodati donji izvorni kôd u protokol datoteka.h, "pošiljatelj.c, 'i' prijamnik.c.'Sad ćemo spasiti sve i zatvoriti ih.
Sada ćemo sastaviti i pridružiti gornji kod koristeći ključnu riječ -lrt odvojeno za pošiljatelja.c i prijemnik.c datoteka. Evo naredbe za to:
$ gcc -o pošiljatelj pošiljatelja.c -lrt$ gcc -o prijamnik prijemnika.c -lrt
Sada ćemo pokrenuti kod pošiljatelja pomoću sljedeće naredbe. Izlaz je dan u nastavku.
$ ./ pošiljatelj
Izvođenjem koda pošiljatelja generiran je objekt dijeljene memorije koji se može naći ispod / dev / shm pomoću naredbe u nastavku:
$ ls -l / dev / shm | grep shmem-primjer
Kada pokrenemo kod prijamnika, dobit ćemo donji izlaz:
$ ./prijamnik
Kad god funkcija gm_unlink () naziva se pomoću prijemnika datoteke.c, 'objekt / dev / shm / shmem-primjer bit će odvojen. U ovom slučaju nećete dobiti objekt na izlazu, kao što je prikazano dolje.
$ ls -l / dev / shm / shmem-primjer
Zaključak
U ovom ste članku naučili kako koristiti POSIX zajedničku memoriju s C programiranjem u Ubuntu 20.04, uključujući svaki poziv funkcije koji se koristi za uspostavljanje zajedničke memorije. Nadam se da vam je ovaj članak pomogao da poboljšate svoje znanje programiranja i obuhvatio svaku sumnju u vezi s ovom temom.