LINUX.ORG.RU

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


0

1

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

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

★★★

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

Ссылки на маны приветствуются.

man mmap

На предмет MAP_SHARED.

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

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

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

man msync

Слушай, это уже не смешно. RTFMFM (включая сноски внизу)!

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

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

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

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

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

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

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

true_admin ★★★★★ ()

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

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

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

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

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

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

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

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

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

А key в XSI IPC (shmget&co)?

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

А key в XSI IPC (shmget&co)?

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

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

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

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

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

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

tailgunner ★★★★★ ()

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

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

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

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

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

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