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

Как использовать функцию mmap на языке C?

Как использовать функцию mmap на языке C?
В mmap () функция используется для сопоставления адресного пространства процесса с файлами или устройствами. Когда файл отображается в адресное пространство процесса, к нему можно получить доступ как к массиву в программе. Это один из наиболее эффективных способов доступа к данным в файле, который обеспечивает простой интерфейс кодирования, который естественен для структуры данных, которую можно оценить без абстракции чтения и записи из файлов. В этой статье мы обсудим, как использовать mmap () функционировать в Linux. Итак, приступим.

Заголовочный файл:

#включать

Синтаксис:

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; iprintf ("[% d]", ptr [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"",
Путь файла)
Как изменить направление прокрутки мыши и сенсорной панели в Windows 10
Мышь а также Сенсорная панельs не только упрощают вычисления, но и делают их более эффективными и требуют меньше времени. Мы не можем представить себе...
Как изменить указатель мыши и размер курсора, цвет и схему в Windows 10
Указатель мыши и курсор в Windows 10 - очень важные аспекты операционной системы. То же самое можно сказать и о других операционных системах, так что,...
Бесплатные движки с открытым исходным кодом для разработки игр для Linux
В этой статье будет рассмотрен список бесплатных игровых движков с открытым исходным кодом, которые можно использовать для разработки 2D- и 3D-игр в L...