C-Programmierung

So verwenden Sie die mmap-Funktion in der Sprache C?

So verwenden Sie die mmap-Funktion in der Sprache C?
Das mmap() Funktion wird für die Zuordnung zwischen einem Prozessadressraum und entweder Dateien oder Geräten verwendet. Wenn eine Datei einem Prozessadressraum zugeordnet wird, kann auf die Datei wie auf ein Array im Programm zugegriffen werden. Dies ist eine der effizientesten Möglichkeiten, auf Daten in der Datei zuzugreifen, und bietet eine nahtlose Codierungsschnittstelle, die für eine Datenstruktur natürlich ist, die ohne die Abstraktion des Lesens und Schreibens aus Dateien bewertet werden kann. In diesem Artikel werden wir diskutieren, wie Sie die mmap() Funktion unter Linux. Also lasst uns anfangen.

Header-Datei:

#einschließen

Syntax:

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

Argumente:

Die Funktion benötigt 6 Argumente:

1. Adresse:

Dieses Argument gibt eine bevorzugte Startadresse für das Mapping an. Wenn dort keine weitere Zuordnung vorhanden ist, wählt der Kernel eine nahegelegene Seitengrenze aus und erstellt die Zuordnung; andernfalls wählt der Kernel eine neue Adresse. Wenn dieses Argument NULL ist, kann der Kernel das Mapping an einer beliebigen Stelle platzieren.

2. Länge:

Dies ist die Anzahl der zuzuordnenden Bytes.

3. schützen:

Dieses Argument wird verwendet, um zu steuern, welche Art von Zugriff erlaubt ist. Dieses Argument kann ein logisches 'ODER' der folgenden Flags sein PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE.  Die Zugriffsarten Lesen, Schreiben und Ausführen sind die Berechtigungen für den Inhalt.

4. Flaggen:

Dieses Argument wird verwendet, um die Art der Karte zu steuern. Im Folgenden sind einige allgemeine Werte der Flags aufgeführt:

  • MAP_SHARED: Dieses Flag wird verwendet, um das Mapping mit allen anderen Prozessen zu teilen, die diesem Objekt zugeordnet sind. Am Mapping-Bereich vorgenommene Änderungen werden in die Datei zurückgeschrieben.
  • MAP_PRIVATE: Wenn dieses Flag verwendet wird, wird das Mapping von keinem anderen Prozess gesehen und die vorgenommenen Änderungen werden nicht in die Datei geschrieben.
  • MAP_ANONYMOUS / MAP_ANON: Dieses Flag wird verwendet, um eine anonyme Zuordnung zu erstellen. Anonyme Zuordnung bedeutet, dass die Zuordnung nicht mit Dateien verbunden ist. Diese Abbildung wird als grundlegendes Primitiv verwendet, um den Heap zu erweitern extend.
  • MAP_FIXED: Wenn dieses Flag verwendet wird, muss das System gezwungen werden, die genaue Mapping-Adresse zu verwenden, die im Adresse Ist dies nicht möglich, schlägt das Mapping fehl.

5. Dateien:

Dies ist der Dateideskriptor, der gemappt werden muss.

6. Versatz:

Dies ist versetzt von der Stelle, an der die Dateizuordnung begann. Vereinfacht gesagt verbindet sich das Mapping mit (Versatz) zu (Versatz+Länge-1) Bytes für die Datei geöffnet am filedes Beschreibung.

Rückgabewerte:

Bei Erfolg, die mmap() gibt 0 zurück; bei einem Fehler gibt die Funktion MAP_FAILED zurück.

Bildlich können wir die Kartenfunktion wie folgt darstellen:

Zum Aufheben der Karte der kartierten Region munmap() Funktion wird verwendet:

Syntax:

int munmap(ungültig *Adresse, Größe_t Länge);

Rückgabewerte:

Bei Erfolg, die munmap() gibt 0 zurück; bei einem Fehler gibt die Funktion -1 . zurück.

Beispiele:

Jetzt sehen wir ein Beispielprogramm für jede der folgenden Funktionen, die den Systemaufruf mmap() verwenden:

  • Speicherzuweisung (Beispiel1.c)
  • Datei lesen (Beispiel2.c)
  • Datei schreiben (Beispiel3.c)
  • Interprozesskommunikation (Beispiel4.c)

Beispiel 1.c

#einschließen
#einschließen
int main()
int N = 5; // Anzahl der Elemente für das Array
int *ptr = mmap ( NULL, N*sizeof(int),
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS,
0, 0);
if(ptr == MAP_FAILED)
printf("Zuordnung fehlgeschlagen\n");
1 zurückgeben;

// Fülle die Elemente des Arrays
for(int i=0; i");
for(int i=0; iprintf("[%d] ",ptr[i]);

printf("\n");
int err = munmap(ptr, 10*sizeof(int));
wenn(err != 0)
printf("Unzuordnung fehlgeschlagen\n");
1 zurückgeben;

0 zurückgeben;

In Beispiel1.c Wir weisen Speicher mit mmap zu. Hier haben wir PROT_READ | . verwendet PROT_WRITE-Schutz zum Lesen und Schreiben in die abgebildete Region. Wir haben das MAP_PRIVATE | . verwendet MAP_ANONYMOUS-Flagge. MAP_PRIVATE wird verwendet, weil die Zuordnungsregion nicht mit anderen Prozessen geteilt wird, und MAP_ANONYMOUS wird verwendet, weil wir hier keine Datei zugeordnet haben. Aus dem gleichen Grund ist die Dateideskriptor und der Versatz Wert wird auf 0 gesetzt.

Beispiel2.c

#einschließen
#einschließen
#einschließen
#einschließen
#einschließen
#einschließen
int main(int argc, char *argv[])
if(argc < 2)
printf("Dateipfad nicht erwähnt\n");
Ausgang (0);

const char *Dateipfad = argv[1];
int fd = open(Dateipfad, O_RDONLY);
if(fd < 0)
printf("\n\"%s\"" konnte nicht geöffnet werden\n"",
Dateipfad)
Top 10 Spiele zum Spielen auf Ubuntu
Die Windows-Plattform war eine der dominierenden Plattformen für Spiele aufgrund des großen Prozentsatzes von Spielen, die heute entwickelt werden, um...
Die 5 besten Arcade-Spiele für Linux
Heutzutage sind Computer ernsthafte Maschinen, die zum Spielen verwendet werden. Wenn du den neuen Highscore nicht bekommst, weißt du was ich meine. I...
Schlacht um Wesnoth 1.13.6 Entwicklung veröffentlicht
Schlacht um Wesnoth 1.13.6, das letzten Monat veröffentlicht wurde, ist die sechste Entwicklungsversion im 1.13.x-Serie und bietet eine Reihe von Verb...