C Programmeren

Hoe de mmap-functie in C-taal te gebruiken?

Hoe de mmap-functie in C-taal te gebruiken?
De mmap() functie wordt gebruikt voor het in kaart brengen tussen een procesadresruimte en bestanden of apparaten. Wanneer een bestand is toegewezen aan een procesadresruimte, kan het bestand worden geopend als een array in het programma. Dit is een van de meest efficiënte manieren om toegang te krijgen tot gegevens in het bestand en biedt een naadloze coderingsinterface die natuurlijk is voor een gegevensstructuur die kan worden beoordeeld zonder de abstractie van lezen en schrijven uit bestanden. In dit artikel gaan we het hebben over het gebruik van de mmap() functie in Linux. Dus laten we beginnen.

Header-bestand:

#include

Syntaxis:

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

Argumenten:

De functie heeft 6 argumenten:

1. adres:

Dit argument geeft een voorkeursstartadres voor de mapping. Als daar geen andere afbeelding bestaat, zal de kernel een nabijgelegen paginagrens kiezen en de afbeelding maken; anders kiest de kernel een nieuw adres. Als dit argument NULL is, kan de kernel de toewijzing overal plaatsen waar het nodig is.

2. lengte:

Dit is het aantal bytes dat moet worden toegewezen.

3. beschermen:

Dit argument wordt gebruikt om te bepalen welk soort toegang is toegestaan. Dit argument kan een logische 'OF' zijn van de volgende vlaggen PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE.  De toegangstypen lezen, schrijven en uitvoeren zijn de machtigingen voor de inhoud.

4. vlaggen:

Dit argument wordt gebruikt om de aard van de kaart te bepalen. Hieronder volgen enkele veelvoorkomende waarden van de vlaggen:

  • MAP_SHARED: Deze vlag wordt gebruikt om de toewijzing te delen met alle andere processen die aan dit object zijn toegewezen. Wijzigingen die in het toewijzingsgebied zijn aangebracht, worden teruggeschreven naar het bestand.
  • MAP_PRIVATE: Wanneer deze vlag wordt gebruikt, wordt de toewijzing niet gezien door andere processen en worden de aangebrachte wijzigingen niet naar het bestand geschreven.
  • MAP_ANONYMOUS / MAP_ANON: Deze vlag wordt gebruikt om een ​​anonieme toewijzing te maken. Anonieme toewijzing betekent dat de toewijzing niet is gekoppeld aan bestanden. Deze afbeelding wordt gebruikt als de basisprimitief om de heap uit te breiden.
  • MAP_FIXED: Wanneer deze vlag wordt gebruikt, moet het systeem worden gedwongen om het exacte mapping-adres te gebruiken dat is opgegeven in de adres Als dit niet mogelijk is, mislukt de mapping.

5. bestanden:

Dit is de bestandsdescriptor die moet worden toegewezen.

6. compensatie:

Dit is een afwijking van waar de bestandstoewijzing begon. In eenvoudige bewoordingen sluit de mapping aan op: (offset) naar (offset+lengte-1) bytes voor het bestand geopend op gearchiveerd descriptor.

Retourwaarden:

Bij succes, de mmap() geeft 0 terug; voor mislukking retourneert de functie MAP_FAILED.

Picturaal kunnen we de kaartfunctie als volgt weergeven:

Voor het ongedaan maken van de kaart van de toegewezen regio munmap() functie wordt gebruikt:

Syntaxis:

int munmap(nietig *adres, size_t lengte);

Retourwaarden:

Bij succes, de munmap() geeft 0 terug; voor mislukking retourneert de functie -1.

Voorbeelden:

Nu zullen we een voorbeeldprogramma zien voor elk van de volgende met behulp van mmap() systeemaanroep:

  • Geheugentoewijzing (voorbeeld1.c)
  • Bestand lezen (Voorbeeld2.c)
  • Bestand schrijven (voorbeeld 3:.c)
  • Interprocescommunicatie (voorbeeld 4).c)

Voorbeeld 1.c

#include
#include
int hoofd()
int N=5; // Aantal elementen voor de array
int *ptr = mmap ( NULL, N*sizeof(int),
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONIEM,
0, 0);
if(ptr == MAP_FAILED)
printf("Toewijzing mislukt\n");
retour 1;

// Vul de elementen van de array
for(int i=0; i ");
for(int i=0; iprintf("[%d] ",ptr[i]);

printf("\n");
int err = munmap(ptr, 10*sizeof(int));
als (err != 0)
printf("Ongedaan maken van toewijzing mislukt\n");
retour 1;

retourneer 0;

In voorbeeld1.c we wijzen geheugen toe met mmap. Hier gebruikten we PROT_READ | PROT_WRITE bescherming voor lezen en schrijven naar de toegewezen regio. We gebruikten de MAP_PRIVATE | MAP_ANONYMOUS vlag. MAP_PRIVATE wordt gebruikt omdat het toewijzingsgebied niet wordt gedeeld met andere processen, en MAP_ANONYMOUS wordt gebruikt omdat we hier geen enkel bestand hebben toegewezen. Om dezelfde reden is de bestandsdescriptor en de offset waarde is ingesteld op 0.

Voorbeeld2.c

#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
als (argc) < 2)
printf("Bestandspad niet vermeld\n");
uitgang(0);

const char *bestandspad = argv[1];
int fd = open(bestandspad, O_RDONLY);
als (fd < 0)
printf("\n\"%s \"" kon niet openen\n"",
bestandspad)
Beste Linux-distributies voor gaming in 2021
Het Linux-besturingssysteem heeft een lange weg afgelegd van zijn oorspronkelijke, eenvoudige, servergebaseerde uiterlijk. Dit besturingssysteem is de...
Hoe u uw gamesessie op Linux kunt vastleggen en streamen
In het verleden werd het spelen van games alleen als een hobby beschouwd, maar met de tijd zag de game-industrie een enorme groei in termen van techno...
Beste spellen om te spelen met handtracking
Oculus Quest introduceerde onlangs het geweldige idee van handtracking zonder controllers. Met een steeds toenemend aantal games en activiteiten die f...