ОС Linux. Мет. указ. к лаб. работам
..pdfсигнал SIGBUS (реакция на него по умолчанию - прекращение процесса с образованием core файла).
Параметр flags определяет способ отображения файла в адресное пространство. Рассмотрим только два его возможных значения: MAP_SHARED и MAP_PRIVATE. Если в качестве его значения выбрано MAP SHARED, то полученное отображение файла впоследствии будет ис пользоваться и другими процессами, вызвавшими mmap для этого файла с аналогичными значениями параметров, а все изменения, сделанные в отображенном файле, будут сохранены во вторичной памяти. Если в ка честве значения параметра flags указано MAP_PRIVATE, то процесс полу чает отображение файла в свое монопольное распоряжение, но все изме нения в нем не могут быть сохранены.
Параметр prot определяет разрешенные операции над областью па мяти, в которую будет отображен файл. В качестве его значения можно использовать значения PROT_READ (разрешено чтение), PROT_WRITE (разрешена запись) или их комбинацию через операцию «побитовое или». Необходимо отметить две существенные особенности системного вызова, связанные с этим параметром:
1.Значение параметра prot не может быть шире, чем операции над файлом, заявленные при его открытии в параметре flags системного вызова ореn().
2.В результате ошибки в операционной системе Linux при работе на 486-х и 586-х процессорах попытка записать в отображение файла, открытое только для записи, более 32-х байт одновременно приводит к ошибке (возникает сигнал о нарушении защиты памяти).
Системный вызов munmap служит для прекращения отображения memory mapped файла в адресное пространство вычислительной системы. Если при системном вызове mmap() было задано значение пapaмeтpa flags, равное MAP_SHARED, и в отображении файла была разрешена операция записи (в параметре prot использовалось значение PROT_WRITE), то munmap синхронизирует содержимое отображения с содержимым файла
во вторичной памяти. После его выполнения области памяти, использовав шиеся для отображения файла, становятся недоступны текущему процессу.
#include <sys/types.h> #include <unistd.h> #include <sys/mman.h>
int munmap (void * start, size_t length);
Параметр start является адресом начала области памяти, выделенной для отображения файла, то есть значением, которое вернул системный вы зов mmap(). Параметр length определяет ее длину, и его значение должно совпадать со значением соответствующего параметра в системном вызове mmap().
Программа, приведенная ниже, создает файл, отображает его в ад ресное пространство процесса и заносит в него информацию с помощью обычных операций языка Си. Обратите внимание на необходимость уве личения размера файла перед его отображением. Созданный файл имеет нулевой размер, и если его с этим размером отобразить в память, то мы сможем записать в него или прочитать из него не более 0 байт, то есть ни чего. Для увеличения размера файла использован системный вызов ftruncate(), хотя это можно было бы сделать и любым другим способом.
int main(void)
{
int fd; /* Файловый дескриптор */
size_t length; /* Длина отображаемой части файла */ int i;
/* struct A - тип данных для заполнения файла,
ptr - начальный адрес выделенной области памяти,
tmpptr - указатель для перемещения внутри области памяти. */ struct А {
double f;
double f2;} *ptr, *tmpptr;
20 |
21 |