C Programmering

POSIX Delat minne med C-programmering

POSIX Delat minne med C-programmering
POSIX-delat minne är ett ramverk för inter-processkommunikation (IPC) som specificeras i POSIX-specifikationerna. Två (eller flera) uppgifter kan läsa från den och skriva till det delade minneszonen medan det delade minnet skapas. POSIX delat minne tvingar inte alltid ut kopior, till skillnad från andra IPC-strukturer (t.ex.g., rör, hylsa etc.) och är önskvärt för vissa program.

POSIX-delade minnessamtal

POSIX-delade minnesfunktioner fokuserade på UNIX-konceptet att objektet måste vara ett dokument när man utför in / ut-aktiviteter på en enhet. Därför, eftersom du reciterar och skriver in på en ömsesidig POSIX-minnesenhet, måste den senare betraktas som ett dokument. Ett minneskartat dokument är en POSIX-delad minnesenhet. Att använda shm_open systemanropsfunktion nedan / dev / shm, separata delade minnesdokument genereras. Det finns bara två dedikerade system för minnesanrop från POSIX, shm_open, och shm_unlink, som är nära besläktade med att öppna och ta bort länk till filsystemsamtal. De ftrunkera, mmap, och kartlägga ramanrop för dokument används för att utföra andra uppgifter i POSIX delat minne. Det är nödvändigt att ansluta ett program som använder POSIX-delade minnessamtal till -lrt.

Program som använder POSIX-delade minnessamtal måste gå igenom följande steg:

Använder sig av shm_open (), bilda ett delat minnesobjekt. Dokumentbeskrivaren kan återställas om bildandet av objektet lyckas.

Med ftrunka (), storleken på objektet kommer att fixas.

Med Karta() och MAP_SHARED, avgränsa detta objekt i nuvarande adressutrymme.

Läs / skriv det delade minnet.

Via kartlägga (), avmarkera det delade minnet.

Använda sig av stänga() för att stänga objektet.

Genom shm_unlink (), radera objektet i det delade minnet.

shm_open ()

Som beskrivits ovan, shm_open () används för att generera ett nytt delat minnesobjekt. Det gör objektet tillgängligt för anropsproceduren med hjälp av den omvända deskriptoren. Följande är definitionen av detta funktionsanrop:

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

Den första parametern är det delade minnesobjektets namn. Det är en icke-avslutad sträng av /namn typ, med villkoret att ingen annan karaktär kan vara en snedstreck än dess första karaktär. Oflag är en liten slöja som skapats med flera av de föregående flaggorna av OR-ing, antingen via O_RDONLY eller O_RDWR. De beskrivna parametrarna indikerar att dess delade minnesobjekt måste formas (O_CREAT) när det inte redan finns och även objektet är tillgängligt för läsning och skrivning (O_RDWR). Det allra sista argumentet anger kataloggodkännanden för det delade minnesobjektet.

shm_unlink ()

Shm_unlink () eliminerar den POSIX-delade minnesenheten som tidigare utvecklats. Heltalsdokumentbeskrivaren för det delade minnesobjektet returneras via ett effektivt samtal till shm_open (). Som definieras under shm_open (), parameternamnet är titeln på den delade minnesenheten. Följande är definitionen av shm_unlink () fungera:

>> Int shm_unlink (const char * name);

ftrunka ()

När du ställer in objektet, ftrunka () metoden är avstängd för att ställa in enhetens storlek i byte. Funktionsdefinitionen är som följer:

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

När du skapar ett delat POSIX-minne är det verkligen nollbyte i storlekskapacitet. Du kan återge den delade POSIX-minnesenheten med byte med storlekslängd via trunkera. Ftrunka ger noll vid körning. Ftrunka utgångar -1 vid ett fel och errno är inställd på att utlösa felet.

mmap ()

Så småningom ställs ett minneskartat dokument med den delade minnesenheten in via mmap () metod. Sedan ger den en minneskartad dokumentpekare som kastas av för att nå den delade minnesenheten. Följande är definitionen av mmap () fungera:

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

I detta är 'addr' den adress till vilken den ska mappas. 'Längden' är intervallet för den delade minnesenheten. Värdena för prot kan skilja sig, men vi använder PROT READ | PROT SKRIV. Det finns flera flaggor, men MAP SHARED är viktigt för delat minne. Nu är 'fd' en dokumentbeskrivare som erhölls tidigare. Offset är den punkt där kartläggningen börjar i den delade minnesenheten; 0-offsetvärdet kan också användas. Efter avslutad, mmap () ger pekaren till mapppositionen för den delade minnesenheten.

kartlägga ()

På den position som riktas av addr och få storlek, längd, kartlägga tar bort det delade minnesobjektet. Munmap ger 0 vid slutförandet och -1 i situationen med felaktighet, i vilket fall errno tilldelas för att utlösa felet.

>> Ogiltig munmap (ogiltig * addr, storlek_t längd);

Exempel: Avsändare och mottagare

Låt oss ta exemplet med avsändaren och mottagaren. Avsändaren skapar ett nytt delat minnesobjekt med namnet / shmem-exempel och skriva in tre siffror i det delade minnet genom det. Nu kan mottagaren exponera det delade minnesobjektet och recitera de tre siffrorna från minnet. Vi skapar tre filer med namnen protokoll.h, avsändare.c, och mottagare.c.

$ touch-protokoll.h
$ touch avsändare.c
$ touch-mottagare.c

Därefter lägger vi till källkoden nedan i filernas protokoll.h, "avsändare.c, 'och' mottagare.c.Nu sparar vi alla och stänger dem.

Nu kommer vi att sammanställa och gå med i koden ovan med hjälp av nyckelordet -lrt separat för avsändaren.c och mottagare.c-fil. Här är kommandot att göra det:

$ gcc -o avsändare.c-lrt
$ gcc -o mottagarmottagare.c-lrt

Nu kör vi avsändarkoden med följande kommando. Resultatet ges nedan.

$ ./avsändare

Kör avsändarkoden, det delade minnesobjektet har genererats och kan hittas under / dev / shm med kommandot nedan:

$ ls -l / dev / shm | grep shmem-exempel

När vi kör mottagarkoden får vi utdata nedan:

$ ./mottagare

När funktionen gm_unlink () kallas med filen 'mottagare.c, 'objektet / dev / shm / shmem-exempel kommer att lossna. I det här fallet får du inget objekt på utdata, som visas nedan.

$ ls -l / dev / shm / shmem-exempel

Slutsats

I den här artikeln lärde du dig hur du använder POSIX Shared Memory med C-programmering i Ubuntu 20.04, inklusive alla funktionssamtal som används för att skapa delat minne. Jag hoppas att den här artikeln hjälpte dig att förbättra din kunskap om programmering och täckte alla tvivel du har om detta ämne.

HD Remastered Games för Linux som aldrig tidigare hade en Linux-version
Många spelutvecklare och utgivare kommer med HD-remaster av gamla spel för att förlänga livstiden för franchisen, snälla fans som begär kompatibilitet...
Hur man använder AutoKey för att automatisera Linux-spel
AutoKey är ett verktyg för desktopautomatisering för Linux och X11, programmerat i Python 3, GTK och Qt. Med hjälp av dess skript och MACRO-funktional...
Hur man visar FPS-räknare i Linux-spel
Linux-spel fick ett stort tryck när Valve tillkännagav Linux-stöd för Steam-klient och deras spel 2012. Sedan dess har många AAA- och indiespel tagit ...