Операционная система Linux. Докторов А.Е. - 20 стр.

UptoLike

Составители: 

/* Открываем файл */
fd = open("mapped.dat", 0_RDWR | O_CREAT, 0666);
/* Вычисляем будущую длину файла для записи в него 1000 структур */
length = 1000*sizeof(struct А);
/*Увеличиваем длину файла с помощью вызова ftruncate(). */
ftruncate(fd, length);
/* Файл отображаем с его начала (offset = 0) и до конца (length = длине
файла). */
ptr = (struct А *) mmap (NULL, length,
PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0);
/* Файловый дескриптор нам более не нужен, и мы его закрываем */
close(fd);
/* Если отобразить файл не удалось сообщаем об ошибке */
if (ptr == MAP_FAILED )
{printf("Mappingfailed! \n"); exit(2); }
/* В цикле заполняем образ файла числами */
tmpptr = ptr;
for(i = 1; i <=100000; i++)
{tmpptr->f= i;
tmpptr->f2 = i*i;
tmpptr++;}
/* Прекращаем отображать файл в память, записываем содержимое ото-
бражения на диск и освобождаем память. */
munmap((void *)ptr, length);
return 0;
}
Задания: Модифицируйте приведенную программу так, чтобы она
отображала файл mapped.dat, записанный программой из примера. Опре-
делите размер файла, который можно отобразить в память. Проверьте,
можно ли отобразить в одну и ту же область памяти несколько файлов.
Реализуйте указанные действия другими средствами языка Си.
22
6. Системные вызовы для работы с файлами, отображаемыми в память.
19
С точки зрения программиста работа с такими файлами выглядит
следующим образом:
Отображение файла из пространства имен в адресное пространство
процесса происходит в два этапа: сначала выполняется отображение
в дисковое пространство, а уже затем из дискового пространства
в адресное. Поэтому вначале файл необходимо открыть, используя
обычный системный вызов ореn().
. Вторым этапом является отображение файла целиком или частично
из дискового пространства в адресное пространство процесса. Для
этого используется системный вызов mmap(). Файл после этого
можно закрыть, выполнив системный вызов close(), так как необхо-
димая информация о расположении файла на диске сохраняется
в других структурах данных при вызове mmap().
#include <sys/types.h>
#include <unistd.h>
#include <sys/mman.h>
void *mmap (void *start, size_t length, int prot, int flags, int fd, off_t offset);
Параметр fd является файловым дескриптором файла, отображаемо-
го в адресное пространство (возвращает системный вызов open()). Значе-
ние параметра start чаще всего выбирается равным NULL, позволяя опера-
ционной системе самой выбрать начало области адресного пространства,
в которую будет отображен файл.
В память будет отображаться часть файла, начиная с позиции внутри
его, заданной значением параметра offset - смещение от начала файла
в байтах, и длиной, равной значению параметра length (тоже в байтах).
Значение параметра length может и превышать реальную длину от пози-
ции offset до конца существующего файла. На поведении системного
вызова это никак не отразится, но в дальнейшем при попытке досту-
па к ячейкам памяти, лежащим вне границ реального файла, возникнет