LINUX.ORG.RU

[mmap] Спроецировать файл в общую память.

 


0

1

Для сдачи идиотических лаб в универе необходимо при программировании под Linux в точности иммитировать средства WinApi. В связи с этим возник вопрос.
В Windows я могу сделать примерно следующее:
В одном процессе:
CreateFile - создаем файл,
CreateFileMapping - создаем кусок shared memory, связанный с этим файлом,
MapViewOfFile - присоединяем этот кусок (и одновременно проекцию файла) к адресному пространству процесса.
В другом процессе:
OpenFileMapping - открываем кусок памяти/проекцию файла
MapViewOfFile - присоединяем к адресному пространству процесса.

Вопрос в следующем: могу ли я в Unix также сделать область памяти по определенному адресу определенной длины одновременно и проекцией файла и общей памятью между процессами?
Понятно, что с помощью mmap я могу присоединить к адресному пространству или кусок общей памяти, созданной с помощью shm_open, или файл на диске. Но можно ли их объединить?
//Я догадываюсь, что с практической точки зрения смысла в этом никакого, но это Российский Университет с преподавателями без компетенции, но с запущенным синдромом вахтера.

★★★

Последнее исправление: unikoid (всего исправлений: 1)

Ответ на: комментарий от mv

Про MAP_SHARED я в курсе, он всего лишь означает, что изменения в сегменте памяти, подключенном через mmap из shared memory или file будут сохраняться в самом объекте (shared memory или file). Понятно, что я могу открыть из другого процесса файл и также замапить его в память, вопрос в том, можно ли обойтись, с одной стороны, без открывания файла во втором процессе, с другой стороны - без копирования из замапленного файла в shared memory.

unikoid ★★★
() автор топика
Ответ на: комментарий от unikoid

s/открывания файла/открытия файла/

unikoid ★★★
() автор топика
Ответ на: комментарий от Rzhepish

Конечно же это не смешно, лол, и я прекрасно понимаю, для чего нужен msync. Более того, текущий вариант реализации использует его! И я прекрасно понимаю, как, замапив файл в память, обмениваться данными между процессами. Только вот вопрос состоит в том, что в венде, когда ты мапишь файл, создается глобальный идентификатор, по которому можно присоединить этот же файл в адресное пространство другого процесса и замапить его там. Без процедуры открытия файла (open) в другом процессе. Как с помощью MAP_SHARED и msync сделать то же самое?

unikoid ★★★
() автор топика
Ответ на: комментарий от unikoid

Попробуй скрестить mmap с shmat/shmget. Без понятия, если это будет работать...

mv ★★★★★
()
Ответ на: комментарий от unikoid

Без процедуры открытия файла (open) в другом процессе

Ну сделай win-подобные обёртки и покажи сырцы преподу :). Если он/она не шарит то подвоха не заметит.

true_admin ★★★★★
()
Ответ на: комментарий от tailgunner

Похоже, тебе нужен дескриптор отображаемой области. Такого в Unix нет.

Большое спасибо за краткий и емкий ответ. Заодно буду знать, как оно называется.

unikoid ★★★
() автор топика
Ответ на: комментарий от true_admin

Ну сделай win-подобные обёртки и покажи сырцы преподу :). Если он/она не шарит то подвоха не заметит.

Ну на такой экстренный случай я могу и под венду все это за 20 минут на паре портировать.

unikoid ★★★
() автор топика
Ответ на: комментарий от tailgunner

Там нет собственно отображения файла в память.

Но есть ключ. Я не знаю, правда, можно ли создать XSI шаренный объект на область памяти, где лежит заммапленный файл.

mv ★★★★★
()
Ответ на: комментарий от tailgunner

...хотя, посмотрев на частный случай CreateFileMapping с INVALID_HANDLE_VALUE вместо дескриптора файла, получается что-то похожее на SysV IPC. но дучше как минимум за счет отсуствия секса с ftok.

tailgunner ★★★★★
()

дорогой студент ты можешь заюзать boost::interprocess
чтобы сразу и там и там работало

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от unikoid

> Только вот вопрос состоит в том, что в венде, когда ты мапишь файл, создается глобальный идентификатор, по которому можно присоединить этот же файл в адресное пространство другого процесса и замапить его там.

> Без процедуры открытия файла (open) в другом процессе.

В чём принципиальная необходимость избежать открытия файла и вызова open()?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.