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.