Теоретическая классификация видов взаимодействия процессов: очереди сообщений, файлы, разделяемая память.


Файлы:
     
Разделяемая память
В ОС Windows Win32 API разделяемая память реализуется через проекцию файла на адресное пространство процесса. Файл может быть: либо настоящий файл на диске, либо безымянный файл, который создаётся внутри файла свопинга.
Для получения разделяемой памяти необходимо создать файл, проецируемый в память не на диске, а в свопинге системы, с помощью функции:

HANDLE            CreateFileMapping(
HANDLE            hFile,               //описание на настоящий файл или           
                                              //  INVALID_HANDLE _VALUE
PSECURITY_ATTRIBUTES            psa,      //атрибуты безопасности
DWORD fdwProtect,       //флаги проецирования
DWORD dwMaximumSizeHigh,    //размер файла
DWORD dwMaximumSizeLow,     //размер файла
PCTSTR pseName);
Флаги проецирования:
      PAGE_READONLY                - память только на чтение
      PAGE_READWRITE
      PAGE_WRITECOPY   - когда будем писать в память, то в памяти данные изменяются, а в файле нет
      SEC_NOCACHE                    - сразу запись на диск, если нет то буферизация

Проекция файла на адресное пространство процесса задается с помощью функции:
LPVOID MapViewOfFile(
            HANDLE            hFileMappingObject,                  //1
            DWORD dwDesiredAcces,                       //2
            DWORD dwFileOffsetHigh,                     //3
            DWORD dwFileOffsetLow,                      //4
            SIZE_T  dwNumberOfBytesToMap);         //5
1 – описатель на объект
2 – желаемый доступ, может быть вида:
      FILE_MAP_READ
      FILE_MAP_WRITE
      FILE_MAP_COPY
      FILE_MAP_ALL_ACCESS
3 – смещение от начала файла
5 – количество байт для окна разделяемой памяти (8 байт)
Функция возвращает адрес этого окна.

Обратная функция:
BOOL                UnmapViewOfFile(
            LPVOID lpBaseAddress);

По окончании работы следует вызвать функции UnmapViewOfFile и CloseHandle для дескриптора спроецированного в память файла.

Комментариев нет:

Отправить комментарий