C Programmering

Hur man använder mmap-funktionen på C-språk?

Hur man använder mmap-funktionen på C-språk?
De mmap () funktionen används för mappning mellan ett processadressutrymme och antingen filer eller enheter. När en fil mappas till ett processadressutrymme kan filen nås som en matris i programmet. Detta är ett av de mest effektiva sätten att komma åt data i filen och ger ett sömlöst kodningsgränssnitt som är naturligt för en datastruktur som kan bedömas utan att han abstraktion av läsning och skrivning från filer. I den här artikeln ska vi diskutera hur man använder mmap () funktion i Linux. Så, låt oss komma igång.

Rubrikfil:

#omfatta

Syntax:

void * mmap (void * address, size_t length, int protect, int flags, int filedes,
off_t offset)

Argument:

Funktionen tar 6 argument:

1. adress:

Detta argument ger en önskad startadress för mappningen. Om en annan mappning inte finns där kommer kärnan att välja en sidgräns i närheten och skapa mappningen. annars väljer kärnan en ny adress. Om det här argumentet är NULL kan kärnan placera kartläggningen var som helst.

2. längd:

Detta är antalet byte som ska mappas.

3. skydda:

Detta argument används för att kontrollera vilken typ av åtkomst som är tillåten. Detta argument kan vara logiskt 'ELLER' för följande flaggor PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE.  Åtkomsttyperna läsa, skriva och köra är behörigheterna för innehållet.

4. flaggor:

Detta argument används för att kontrollera karaktären på kartan. Följande är några vanliga värden för flaggorna:

  • MAP_SHARED: Denna flagga används för att dela kartläggningen med alla andra processer som mappas till detta objekt. Ändringar som gjorts i kartområdet kommer att skrivas tillbaka till filen.
  • MAP_PRIVATE: När den här flaggan används kommer kartläggningen inte att ses av andra processer och ändringarna kommer inte att skrivas till filen.
  • MAP_ANONYMOUS / MAP_ANON: Denna flagga används för att skapa en anonym kartläggning. Anonym kartläggning innebär att kartläggningen inte är ansluten till några filer. Denna kartläggning används som grundläggande primitiv för att förlänga högen.
  • MAP_FIXED: När denna flagga används måste systemet tvingas använda den exakta mappningsadress som anges i adress Om detta inte är möjligt misslyckas mappningen.

5. ansöker:

Detta är filbeskrivaren som måste mappas.

6. offset:

Detta kompenseras från var filmappningen startade. Enkelt uttryckt ansluter kartläggningen till (offset) till (offset + längd-1) byte för filen öppnas den lämnar in beskrivare.

Returvärden:

När det gäller framgång, mmap () returnerar 0; för fel returnerar funktionen MAP_FAILED.

Bildmässigt kan vi representera kartfunktionen enligt följande:

För att avbilda den mappade regionen kartlägga () funktionen används:

Syntax:

int munmap(tomhet *adress, storlek_t längd);

Returvärden:

När det gäller framgång, kartlägga () returnerar 0; för fel returnerar funktionen -1.

Exempel:

Nu ser vi ett exempelprogram för vart och ett av följande med mmap () systemanrop:

  • Minnesallokering (exempel 1.c)
  • Läser fil (exempel 2.c)
  • Skrivfil (exempel 3.c)
  • Interprocesskommunikation (exempel 4.c)

Exempel 1.c

#omfatta
#omfatta
int main ()
int N = 5; // Antal element för matrisen
int * ptr = mmap (NULL, N * sizeof (int),
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS,
0, 0);
om (ptr == MAP_FAILED)
printf ("Mappning misslyckades \ n");
retur 1;

// Fyll elementen i matrisen
för (int i = 0; i ");
för (int i = 0; iprintf ("[% d]", ptr [i]);

printf ("\ n");
int err = munmap (ptr, 10 * sizeof (int));
if (err != 0)
printf ("Unmapping Misslyckades \ n");
retur 1;

returnera 0;

I exempel 1.c vi fördelar minne med hjälp av mmap. Här använde vi PROT_READ | PROT_WRITE-skydd för läsning och skrivning till den mappade regionen. Vi använde MAP_PRIVATE | MAP_ANONYMOUS flagga. MAP_PRIVATE används eftersom kartläggningsregionen inte delas med andra processer och MAP_ANONYMOUS används för att här har vi inte kartlagt någon fil. Av samma anledning har filbeskrivare och den offset värdet är satt till 0.

Exempel 2.c

#omfatta
#omfatta
#omfatta
#omfatta
#omfatta
#omfatta
int main (int argc, char * argv [])
om (argc < 2)
printf ("Filvägen nämns inte \ n");
exit (0);

const char * filepath = argv [1];
int fd = öppen (filpath, O_RDONLY);
if (fd < 0)
printf ("\ n \"% s \ ""kunde inte öppna \ n"",
sökväg)
Topp 5 spelinspelningskort
Vi har alla sett och älskat streaming av spel på YouTube. PewDiePie, Jakesepticye och Markiplier är bara några av de bästa spelarna som har tjänat mil...
Hur man utvecklar ett spel på Linux
För ett decennium sedan skulle inte många Linux-användare förutsäga att deras favoritoperativsystem en dag skulle vara en populär spelplattform för ko...
Portar med öppen källkod för kommersiella spelmotorer
Gratis, öppen källkod och plattformsmekaniska rekreationer kan användas för att spela gamla såväl som några av de ganska senaste speltitlarna. I den h...