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

So verwenden Sie die MMAP -Funktion in der C -Sprache?
Der mmap () Die Funktion wird zum Zuordnen zwischen einem Prozessadressenraum und den Dateien oder Geräten verwendet. Wenn eine Datei einem Prozessadressenraum zugeordnet ist, kann die Datei wie ein Array im Programm zugegriffen werden. Dies ist eine der effizientesten Möglichkeiten, um in der Datei auf Daten zuzugreifen, und bietet eine nahtlose Codierungsschnittstelle, die für eine Datenstruktur natürlich ist. In diesem Artikel werden wir diskutieren, wie man das benutzt mmap () Funktion in Linux. Also lasst uns anfangen.

Header-Datei:

#enthalten

Syntax:

void * mmap (void * adresse, size_t länge, int schützende, int flags, int -Anmeldungen,
OFF_T Offset)

Argumente:

Die Funktion dauert 6 Argumente:

Adresse:

Dieses Argument gibt eine bevorzugte Startadresse für die Zuordnung. Wenn dort nicht eine andere Zuordnung existiert, wählt der Kernel eine nahe gelegene Seitengrenze aus und erstellt die Zuordnung. Andernfalls wählt der Kernel eine neue Adresse aus. Wenn dieses Argument null ist, kann der Kernel die Zuordnung überall hinstellen.

Länge:

Dies ist die Anzahl der Bytes, die zugeordnet werden sollen.

schützen:

Dieses Argument wird verwendet, um zu kontrollieren, welche Art von Zugang zulässig ist. Dieses Argument kann logisch sein oder 'der folgenden Flaggen Prot_read | Prot_write | Prot_exec | Prot_none. Die Zugriffstypen von Lesen, Schreiben und Ausführen sind die Berechtigungen des Inhalts.

Flaggen:

Dieses Argument wird verwendet, um die Art der Karte zu kontrollieren. Im Folgenden finden Sie einige gemeinsame Werte der Flags:

  • Map_shared: Dieses Flag wird verwendet, um die Zuordnung mit allen anderen Prozessen zu teilen, die diesem Objekt zugeordnet sind. Änderungen an der Mapping -Region werden in die Datei zurückgeschrieben.
  • Map_private: Wenn dieses Flag verwendet wird, wird die Zuordnung von anderen Prozessen nicht ersichtlich, und die vorgenommenen Änderungen werden nicht in die Datei geschrieben.
  • Map_anonymous / map_anon: Diese Flagge wird verwendet, um eine anonyme Zuordnung zu erstellen. Anonymous Mapping bedeutet, dass die Zuordnung nicht mit Dateien verbunden ist. Diese Zuordnung wird als grundlegender Primitiv verwendet, um den Haufen zu erweitern.
  • Map_fixed: Wenn dieses Flag verwendet wird, muss das System gezwungen werden, die in der genannte genaue Zuordnungsadresse zu verwenden Adresse Wenn dies nicht möglich ist, wird die Zuordnung fehlgeschlagen.

Abstellungen:

Dies ist der Dateideskriptor, der zugeordnet werden muss.

Offset:

Dies ist ausgefallen, wo die Dateizuordnung begonnen hat. In einfachen Worten stellt die Zuordnung eine Verbindung zu einer Verbindung zu (Offset) Zu (Offset+Länge-1) Bytes für die Datei öffnen auf Abstellungen Deskriptor.

Rückgabewerte:

Auf Erfolg die mmap () Gibt 0 zurück; Für den Fehler gibt die Funktion map_failed zurück.

Bildend können wir die Kartenfunktion wie folgt darstellen:

Für die Entfaltung der kartierten Region Munmap () Funktion wird verwendet:

Syntax:

int Munmap(Leere *Adresse, size_t Länge);

Rückgabewerte:

Auf Erfolg die Munmap () Gibt 0 zurück; Für den Fehler gibt die Funktion -1 zurück.

Beispiele:

Jetzt sehen wir ein Beispielprogramm für jeden der folgenden MMAP () -Systemanrufe:

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

Beispiel 1.C

#enthalten
#enthalten
int main ()
int n = 5;
int *ptr = mmap (null, n *sizeof (int),
Prot_read | Prot_write, map_private | Map_anonymous, 0, 0);
if (ptr == map_failed)
printf ("Mapping fehlgeschlagen \ n");
Rückkehr 1;

für (int i = 0; iptr [i] = i*10;
für (int i = 0; iprintf ("[%d]", ptr [i]);
printf ("\ n");
int err = munmap (ptr, 10*sizeof (int));
if (arr != 0)
printf ("Unmapping fehlgeschlagen \ n");
Rückkehr 1;

Rückkehr 0;

In Beispiel1.c Wir zuordnen Speicher mit MMAP zu. Hier haben wir prot_read | verwendet Prot_write -Schutz für das Lesen und Schreiben in die kartierte Region. Wir haben das MAP_PRIVATE | verwendet MAP_Anonyme Flagge. MAP_PRIVATE wird verwendet, weil die Zuordnungsregion nicht mit anderen Prozessen freigegeben wird und MAP_anonymous verwendet wird, da wir hier keine Datei abgebildet haben. Aus dem gleichen Grund die Dateideskriptor und das Offset Wert wird auf 0 gesetzt.

Beispiel2.C

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

const char *filepath = argv [1];
int fd = open (filepath, o_rdonly);
if (fd < 0)
printf ("\ n \"%s \ ""konnte \ n nicht öffnen"",
Dateipfad)