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

UptoLike

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

сигнал 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 синхронизирует содержимое отображения с содержимым файла
20
во вторичной памяти. После его выполнения области памяти, использовав-
шиеся для отображения файла, становятся недоступны текущему процессу.
#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;
21