C Програмиране

Как да използвам функцията mmap на C език?

Как да използвам функцията mmap на C език?
The mmap () функцията се използва за картографиране между адресното пространство на процеса и файловете, или устройствата. Когато файлът се преобразува в адресното пространство на процеса, файлът може да бъде достъпен като масив в програмата. Това е един от най-ефективните начини за достъп до данни във файла и осигурява безпроблемен интерфейс за кодиране, който е естествен за структурата на данните, която може да бъде оценена без абстракция на четене и запис от файлове. В тази статия ще обсъдим как да използваме mmap () функция в Linux. И така, нека започнем.

Заглавен файл:

#include

Синтаксис:

void * mmap (void * адрес, size_t дължина, int защита, int флагове, int подаде,
off_t компенсиране)

Аргументи:

Функцията отнема 6 аргумента:

1. адрес:

Този аргумент дава предпочитан начален адрес за картографиране. Ако друго картографиране не съществува там, тогава ядрото ще избере границата на близката страница и ще създаде картографирането; в противен случай ядрото избира нов адрес. Ако този аргумент е NULL, тогава ядрото може да постави картографирането навсякъде, където сметне за добре.

2. дължина:

Това е броят на байтовете, които трябва да бъдат картографирани.

3. защита:

Този аргумент се използва, за да се контролира какъв вид достъп е разрешен. Този аргумент може да е логичен „ИЛИ“ на следните флагове PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE.  Видовете достъп за четене, запис и изпълнение са разрешенията за съдържанието.

4. знамена:

Този аргумент се използва за контрол на естеството на картата. Следват някои често срещани стойности на флаговете:

  • MAP_SHARED: Този флаг се използва за споделяне на картографирането с всички други процеси, които са съпоставени с този обект. Промените, направени в региона на картографиране, ще бъдат записани обратно във файла.
  • MAP_PRIVATE: Когато се използва този флаг, картографирането няма да се види от други процеси и направените промени няма да бъдат записани във файла.
  • MAP_ANONYMOUS / MAP_ANON: Този флаг се използва за създаване на анонимно картографиране. Анонимното картографиране означава, че картографирането не е свързано с никакви файлове. Това картографиране се използва като основен примитив за разширяване на купчината.
  • MAP_FIXED: Когато се използва този флаг, системата трябва да бъде принудена да използва точния адрес на картографиране, посочен в адрес Ако това не е възможно, тогава картографирането ще бъде неуспешно.

5. декларирани:

Това е файловият дескриптор, който трябва да бъде картографиран.

6. изместване:

Това се компенсира от мястото, където е започнало картографирането. С прости думи, картографирането се свързва с (изместване) да се (отместване + дължина-1) байта за файла, отворен на подадени дескриптор.

Върнати стойности:

При успех, mmap () връща 0; при неуспех функцията връща MAP_FAILED.

Нагледно можем да представим функцията на картата по следния начин:

За демапиране на картографирания регион munmap () функция се използва:

Синтаксис:

int munmap(празно *адрес, размер_т дължина);

Върнати стойности:

При успех, munmap () връща 0; при неуспех функцията връща -1.

Примери:

Сега ще видим примерна програма за всяко от следните, използвайки системно повикване mmap ():

  • Разпределение на паметта (Пример1.° С)
  • Файл за четене (Пример2.° С)
  • Файл за писане (Пример 3.° С)
  • Междупроцесна комуникация (Пример 4.° С)

Пример1.° С

#include
#include
int main ()
int N = 5; // Брой елементи за масива
int * ptr = mmap (NULL, N * sizeof (int),
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS,
0, 0);
ако (ptr == MAP_FAILED)
printf ("Неуспешно картографиране \ n");
връщане 1;

// Попълнете елементите на масива
за (int i = 0; i ");
за (int i = 0; iprintf ("[% d]", ptr [i]);

printf ("\ n");
int err = munmap (ptr, 10 * sizeof (int));
ако (грешка != 0)
printf ("Неуспешно демапиране \ n");
връщане 1;

връщане 0;

В Пример1.c разпределяме паметта с помощта на mmap. Тук използвахме PROT_READ | PROT_WRITE защита за четене и запис в картографирания регион. Използвахме MAP_PRIVATE | MAP_ANONYMOUS флаг. MAP_PRIVATE се използва, тъй като регионът на картографиране не се споделя с други процеси, а MAP_ANONYMOUS се използва, защото тук не сме картографирали нито един файл. По същата причина дескриптор на файл и изместване стойност е зададена на 0.

Пример2.° С

#include
#include
#include
#include
#include
#include
int main (int argc, char * argv [])
ако (argc < 2)
printf ("Пътят до файла не е споменат \ n");
изход (0);

const char * filepath = argv [1];
int fd = отворен (filepath, O_RDONLY);
ако (fd < 0)
printf ("\ n \"% s \ ""не можа да се отвори \ n"",
файлова пътека)
Как да покажа брояч на FPS в игрите на Linux
Linux игрите получиха голям тласък, когато Valve обяви поддръжка на Linux за Steam клиент и техните игри през 2012 г. Оттогава много AAA и независими ...
Как да изтеглите и пуснете Civilization VI на Сид Майер на Linux
Въведение в играта Civilization 6 е модерен поглед върху класическата концепция, въведена в поредицата от игрите Age of Empires. Идеята беше доста про...
Как да инсталирате и играете Doom на Linux
Въведение в Doom Серията Doom възниква през 90-те години след пускането на оригиналния Doom. Това беше незабавен хит и от този момент нататък серията ...