Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ОС Linux. Мет. указ. к лаб. работам

..pdf
Скачиваний:
26
Добавлен:
21.05.2015
Размер:
271.51 Кб
Скачать

сигнал 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