C Programování

Sdílená paměť POSIX s programováním C

Sdílená paměť POSIX s programováním C
Sdílená paměť POSIX je rámec pro meziprocesovou komunikaci (IPC) specifikovaný ve specifikacích POSIX. Při vytváření sdílené paměti z ní mohou číst a zapisovat do zóny sdílené paměti dva (nebo více) úkolů. Sdílená paměť POSIX ne vždy vynucuje výplaty kopií, na rozdíl od jiných struktur IPC (např.G., potrubí, zásuvka atd.) a je u některých programů žádoucí.

Hovory sdílené paměti POSIX

Funkce sdílené paměti POSIX se zaměřily na koncept UNIX, že objekt musí být dokumentem při provádění vstupních / výstupních aktivit na entitě. Proto, protože recitujete a přihlašujete k entitě vzájemné paměti POSIX, musí být tato entita považována za dokument. Dokument mapovaný do paměti je entita sdílené paměti POSIX. Chcete-li použít shm_open funkce systémového volání níže / dev / shm, jsou generovány samostatné dokumenty sdílené paměti. Z POSIXu existují pouze dvě vyhrazená systémová volání sdílené paměti, shm_open, a shm_unlink, které úzce souvisí s otevíráním a odpojováním hovorů systému souborů. The ftruncate, mmap, a munmapa volání rámce pro dokumenty se používají k provádění dalších úkolů ve sdílené paměti POSIX. Je nutné připojit program, který používá volání sdílené paměti POSIX -lrt.

Programy využívající volání sdílené paměti POSIX musí projít následujícími kroky:

Použitím shm_open (), tvoří objekt sdílené paměti. Pokud je vytvoření objektu úspěšné, lze deskriptor dokumentu vrátit zpět.

S ftruncate (), velikost objektu bude opravena.

S mapa() a MAP_SHARED, vymezit tento objekt do současného adresního prostoru.

Čtení / zápis do sdílené paměti.

Přes munmap (), zruší vymezení sdílené paměti.

Použití zavřít() zavřít objekt.

Přes shm_unlink (), odstranit objekt ve sdílené paměti.

shm_open ()

Jak je popsáno výše, shm_open () se používá ke generování nového objektu sdílené paměti. Zpřístupňuje objekt volající proceduře pomocí reverzního deskriptoru. Následuje definice tohoto volání funkce:

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

První parametr je název objektu sdílené paměti. Jedná se o řetězec zakončený nulou /název typu, s podmínkou, že žádný jiný znak nemůže být lomítko jiný než jeho první znak. Oflag je malý závoj vytvořený s několika předchozími příznaky pomocí OR-ing, ať už prostřednictvím O_RDONLY nebo O_RDWR. Popsané parametry naznačují, že jeho objekt sdílené paměti musí být vytvořen (O_CREAT), když ještě neexistuje, a také je objekt k dispozici pro čtení a zápis (O_RDWR). Úplně poslední argument nastavuje schválení adresáře pro objekt sdílené paměti.

shm_unlink ()

Shm_unlink () eliminuje entitu sdílené paměti POSIX, která byla dříve vyvinuta. Celočíselný deskriptor dokumentu pro objekt sdílené paměti je vrácen prostřednictvím efektivního volání shm_open (). Jak je definováno pod shm_open (), název parametru je název entity sdílené paměti. Následuje definice shm_unlink () funkce:

>> Int shm_unlink (const char * name);

ftruncate ()

Po nastavení objektu se ftruncate () metoda je odložena k nastavení velikosti entity v bajtech. Definice funkce je následující:

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

Při konstrukci sdílené paměti POSIX má kapacitu velikosti nula bajtů. Entitu sdílené paměti POSIX můžete vykreslit pomocí bajtů o délce přes ftruncate. Ftruncate při provádění přináší nulu. Ftruncate výstupy -1 v případě poruchy a errno je nastavena na spuštění chyby.

mmap ()

Nakonec je dokument mapovaný na paměť s entitou sdílené paměti nastaven prostřednictvím mmap () metoda. Poté získá ukazatel mapovaného na paměť, který je odhozen k dosažení entity sdílené paměti. Následuje definice mmap () funkce:

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

V tomto případě je „addr“ adresa, na kterou bude namapována. „Délka“ je rozsah entity sdílené paměti. Hodnoty pro prot se mohou lišit, ale použijeme PROT READ | OCHRANNÝ NAPIS. Existuje několik příznaků, ale MAP SHARED je nezbytný pro sdílenou paměť. Nyní je „fd“ deskriptor dokumentu, který byl získán dříve. Ofset je bod, kde začíná mapování v entitě sdílené paměti; lze také použít hodnotu offsetu 0. Po dokončení, mmap () získá ukazatel na pozici mapování entity sdílené paměti.

munmap ()

Na pozici směrovanou adresou a získávání velikosti, délky, munmapa zruší mapování položky sdílené paměti. Munmap získá 0 po dokončení a -1 v případě nepřesnosti, v takovém případě je přiřazeno errno ke spuštění chyby.

>> Void munmap (void * addr, size_t length);

Příklad: Odesílatel a příjemce

Vezměme si příklad odesílatele a příjemce. Odesílatel vytvoří nový objekt sdílené paměti se jménem / shmem-příklad a vložit do ní tři číslice do sdílené paměti. Nyní může přijímač vystavit objekt sdílené paměti a recitovat tři číslice z paměti. Vytvoříme tři soubory se jmény protokol.h, odesílatel.C, a přijímač.C.

$ dotykový protokol.h
$ dotykový odesílatel.C
$ dotykový přijímač.C

Dále přidáme níže uvedený zdrojový kód do protokolu souborů.h, “odesílatel.c, 'a' přijímač.C.„Nyní všechny uložíme a zavřeme je.

Nyní budeme kompilovat a spojovat výše uvedený kód pomocí klíčového slova -lrt zvlášť pro odesílatele.ca přijímač.soubor c. Zde je příkaz:

$ gcc -o odesílatel.c -lrt
$ gcc -o přijímač přijímač.c -lrt

Nyní spustíme kód odesílatele pomocí následujícího příkazu. Výstup je uveden níže.

$ ./odesílatel

Spuštěním kódu odesílatele byl vygenerován objekt sdílené paměti, který najdete níže / dev / shm pomocí níže uvedeného příkazu:

$ ls -l / dev / shm | grep shmem-příklad

Když spustíme kód přijímače, získáme výstup níže:

$ ./přijímač

Kdykoli funkce gm_unlink () je volána pomocí přijímače souborů.c, „objekt / dev / shm / shmem-příklad bude odpojen. V tomto případě nezískáte na výstupu žádný objekt, jak je znázorněno níže.

$ ls -l / dev / shm / shmem-příklad

Závěr

V tomto článku jste se naučili, jak používat sdílenou paměť POSIX s programováním v C v Ubuntu 20.04, včetně všech volání funkcí použitých k vytvoření sdílené paměti. Doufám, že vám tento článek pomohl zlepšit vaše znalosti programování a pokryl všechny vaše pochybnosti o tomto tématu.

Hry Jak stáhnout a přehrát Sid Meier's Civilization VI v systému Linux
Jak stáhnout a přehrát Sid Meier's Civilization VI v systému Linux
Úvod do hry Civilization 6 je moderní pojetí klasického konceptu představeného v sérii her Age of Empires. Myšlenka byla docela jednoduchá; začali bys...
Hry Jak nainstalovat a hrát Doom na Linuxu
Jak nainstalovat a hrát Doom na Linuxu
Úvod do Doom Série Doom vznikla v 90. letech po vydání původního Doomu. Byl to okamžitý hit a od té doby herní série získala řadu ocenění a původní Do...
Hry Vulkan pro uživatele Linuxu
Vulkan pro uživatele Linuxu
S každou novou generací grafických karet vidíme, že vývojáři her posouvají hranice grafické věrnosti a přibližují se k fotorealismu. Ale navzdory vešk...