Jak używać funkcji MMAP w języku C?

Jak używać funkcji MMAP w języku C?
mmap () Funkcja jest używana do mapowania pomiędzy przestrzenią adresu a plikami lub urządzeniami. Gdy plik jest odwzorowany na przestrzeń adresu procesowego, można uzyskać dostęp do tablicy w programie. Jest to jeden z najbardziej wydajnych sposobów dostępu do danych w pliku i zapewnia bezproblemowy interfejs kodowania, który jest naturalny dla struktury danych, którą można ocenić bez abstrakcji czytania i pisania z plików. W tym artykule omówimy, jak korzystać z mmap () funkcja w Linux. Więc zacznijmy.

Plik nagłówka:

#włączać

Składnia:

void * mmap (void * adres, rozmiar_t długość, int chroń, int flagi, int hitedes,
Off_t Offset)

Argumenty:

Funkcja przyjmuje 6 argumentów:

adres:

Ten argument podaje preferowany adres początkowy do mapowania. Jeśli nie istnieje inne mapowanie, jądro wybierze pobliską granicę strony i utworzy mapowanie; W przeciwnym razie jądro wybiera nowy adres. Jeśli ten argument jest zerowy, wówczas jądro może umieścić mapowanie w dowolnym miejscu, w którym uważa.

długość:

To jest liczba bajtów, które należy zmapować.

chronić:

Ten argument służy do kontrolowania tego, jaki rodzaj dostępu jest dozwolony. Ten argument może być logiczny „lub” z następujących flag Prot_read | Prot_write | Prot_exec | Prot_none. Typy dostępu do odczytu, zapisu i wykonania to uprawnienia do treści.

Flagi:

Ten argument służy do kontrolowania natury mapy. Poniżej znajdują się niektóre wspólne wartości flag:

  • Map_shared: Ta flaga służy do udostępniania mapowania ze wszystkimi innymi procesami, które są odwzorowane na ten obiekt. Zmiany wprowadzone w regionie mapowania zostaną zapisane z powrotem do pliku.
  • Map_private: Gdy flaga zostanie użyta, mapowanie nie będzie widoczne w żadnych innych procesach, a wprowadzone zmiany nie zostaną zapisane do pliku.
  • Map_anonimiczne / map_anon: Ta flaga służy do stworzenia anonimowego mapowania. Anonimowe mapowanie oznacza, że ​​mapowanie nie jest podłączone do żadnych plików. To mapowanie jest używane jako podstawowy prymitywny do rozszerzenia sterty.
  • Map_fixed: Gdy używana jest ta flaga, system musi być zmuszony do użycia dokładnego adresu mapowania określonego w adres Jeśli nie jest to możliwe, mapowanie zostanie nie udane.

Siledes:

To jest deskryptor pliku, który należy zmapować.

zrównoważyć:

Jest to przesunięte od miejsca, w którym rozpoczęło się mapowanie plików. Mówiąc prosto, mapowanie łączy się z (zrównoważyć) Do (przesunięcie+długość-1) bajty dla pliku otwarte zapisane deskryptor.

Zwracaj wartości:

O sukcesie, mmap () zwraca 0; W przypadku awarii funkcja zwraca MAP_FAILED.

Pictoralnie możemy reprezentować funkcję mapy w następujący sposób:

Aby unfemap mapowany region Munmap () używana jest funkcja:

Składnia:

Int Munmap(próżnia *adres, size_t długość);

Zwracaj wartości:

O sukcesie, Munmap () zwraca 0; W przypadku awarii funkcja zwraca -1.

Przykłady:

Teraz zobaczymy przykładowy program dla każdego z poniższych przy użyciu wywołania systemu MMAP ():

  • Alokacja pamięci (przykład1.C)
  • Czytanie pliku (przykład2.C)
  • Pisanie pliku (przykład3.C)
  • Komunikacja międzyprocesowa (przykład 4.C)

Przykład 1.C

#włączać
#włączać
int main ()
int n = 5;
int *ptr = mmap (null, n *sizeof (int),
Prot_read | Prot_write, map_private | Map_anonimii, 0, 0);
if (ptr == map_failed)
printf („mapowanie nie powiodło się \ n”);
zwrot 1;

dla (int i = 0; iptr [i] = i*10;
dla (int i = 0; iprintf („[%d]”, ptr [i]);
printf („\ n”);
int err = munMap (ptr, 10*sizeof (int));
if (err != 0)
printf („Unmapping nie powiodło się \ n”);
zwrot 1;

powrót 0;

W przykładzie1.c Przydzielamy pamięć za pomocą MMAP. Tutaj użyliśmy prot_read | Prot_write Ochrona do czytania i pisania do mapowanego regionu. Użyliśmy map_private | Flaga map_anonimii. MAP_Private jest używany, ponieważ region mapowania nie jest udostępniany innymi procesami, a MAP_ANONOMOUS jest używany, ponieważ tutaj nie zmapowaliśmy żadnego pliku. Z tego samego powodu deskryptor pliku i zrównoważyć Wartość jest ustawiona na 0.

Przykład2.C

#włączać
#włączać
#włączać
#włączać
#włączać
#włączać
int main (int argc, char *argv [])
if (argc < 2)
printf („Nie wspomniana ścieżka pliku \ n”);
wyjście (0);

const char *filepath = argv [1];
int fd = Open (FilePath, o_rdonly);
if (fd < 0)
printf ("\ n \"%s \ ""nie mógł otworzyć \ n"",
ścieżka pliku)