C Programiranje

POSIX zajednička memorija s C programiranjem

POSIX zajednička memorija s C programiranjem
POSIX zajednička memorija je okvir za međuprocesnu komunikaciju (IPC) naveden u POSIX specifikacijama. Dva (ili više) zadatka mogu čitati iz njega i pisati u zonu dijeljene memorije dok uspostavljaju zajedničku memoriju. POSIX zajednička memorija ne provodi uvijek isplate kopija, za razliku od ostalih IPC struktura (npr.g., cijev, utičnica itd.), a poželjno je za određene programe.

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.

SuperTuxKart za Linux
SuperTuxKart sjajan je naslov osmišljen kako bi vam besplatno pružio iskustvo Mario Kart na vašem Linux sustavu. Prilično je izazovno i zabavno igrati...
Vodič za bitku za Wesnoth
Bitka za Wesnoth jedna je od najpopularnijih strateških igara otvorenog koda koje trenutno možete igrati. Ne samo da se ova igra razvija već jako dugo...
0 A.D. Vodič
Od mnogih strateških igara tamo, 0 A.D. uspijeva se istaknuti kao sveobuhvatan naslov i vrlo duboka, taktička igra unatoč tome što je otvoren izvor. R...