Заглавен файл:
#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; 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"",
файлова пътека)