У меня есть 3 процесса, взаимодействующих по именованным каналам: сервер, писатель, читатель.Основная идея заключается в том, что Writer может хранить огромные (~ ГБ) двоичные двоичные объекты на сервере , и считыватели могут его извлечь.Но вместо отправки данных по именованному каналу используется отображение памяти.
Сервер создает неназванное отображение с файловой поддержкой с CreateFileMapping
с защитой PAGE_READWRITE
, затем дублирует дескрипторв писатель .После того, как писатель выполнил свою работу, дескриптор дублируется на любое количество читателей .
писатель отображает дескриптор с помощью MapViewOfFile
в режиме FILE_MAP_WRITE
.
Считыватель отображает маркер с MapViewOfFile
в режиме FILE_MAP_READ|FILE_MAP_COPY
.
На считывателе Я хочу семантику копирования при записи, так что пока отображение только для чтения, оно распределяется между всеми экземплярами читателя.Но если читатель хочет написать в него (например, анализ на месте или обработку изображений), воздействия должны быть ограничены процессом модификации с наименьшим количеством копируемых страниц.
Проблема
Когда считыватель пытается записать в отображение, он умирает с ошибкой сегментации, как если бы FILE_MAP_COPY
не рассматривалось.Что не так с вышеописанным методом?В соответствии с MSDN это должно работать ...
У нас такой же механизм реализован и в linux (с mmap
и передачей fd во вспомогательных буферах AF_UNIX), и он работает как положено.