Заголовочный файл:
#включатьСинтаксис:
void * mmap (void * address, size_t length, int protect, int flags, int filedes,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. filedes:
Это дескриптор файла, который нужно сопоставить.
6. компенсировать:
Это смещение от того места, где началось сопоставление файлов. Проще говоря, отображение подключается к (компенсировать) к (смещение + длина-1) байтов для файла, открытого на Filedes дескриптор.
Возвращаемые значения:
В случае успеха mmap () возвращает 0; в случае сбоя функция возвращает MAP_FAILED.
Графически мы можем представить функцию карты следующим образом:
Для отмены сопоставления отображенного региона munmap () функция используется:
Синтаксис:
int munmap(пустота *адрес, size_t длина);
Возвращаемые значения:
В случае успеха munmap () возвращает 0; в случае неудачи функция возвращает -1.
Примеры:
Теперь мы увидим пример программы для каждого из следующих случаев, использующих системный вызов mmap ():
- Выделение памяти (Пример 1.в)
- Чтение файла (Пример2.в)
- Запись файла (Пример 3.в)
- Межпроцессное взаимодействие (Пример 4.в)
Пример1.c
#включать#включать
int main ()
int N = 5; // Количество элементов в массиве
int * ptr = mmap (NULL, N * sizeof (целое),
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS,
0, 0);
if (ptr == MAP_FAILED)
printf ("Ошибка сопоставления \ n");
возврат 1;
// Заполняем элементы массива
для (int я = 0; я ");
для (int i = 0; i
printf ("\ п");
int err = munmap (ptr, 10 * sizeof (int));
если (ошибка != 0)
printf ("Не удалось отключить отображение \ n");
возврат 1;
возврат 0;
В Example1.c мы выделяем память с помощью mmap. Здесь мы использовали PROT_READ | PROT_WRITE защита для чтения и записи в отображаемую область. Мы использовали MAP_PRIVATE | Флаг MAP_ANONYMOUS. MAP_PRIVATE используется, потому что область сопоставления не используется совместно с другими процессами, а MAP_ANONYMOUS используется, потому что здесь мы не сопоставили ни один файл. По той же причине дескриптор файла и компенсировать значение установлено на 0.
Пример2.c
#включать#включать
#включать
#включать
#включать
#включать
int main (int argc, char * argv [])
если (argc < 2)
printf ("Путь к файлу не указан \ n");
выход (0);
const char * filepath = argv [1];
int fd = open (путь к файлу, O_RDONLY);
если (fd < 0)
printf ("\ n \"% s \ ""не удалось открыть \ n"",
Путь файла)