Два приложения C++, совместно использующие регион только для чтения памяти на Linux

У меня есть два процесса P1 и P2.

У меня есть этот большой ресурс только для чтения, названный "R", к которому я хочу, чтобы и P1 и P2 имели доступ.

R не является просто "плоской" группой байтов; это - набор объектов C++, которые указывают друг другу.

Я предпочел бы, чтобы P1 и P2 только совместно использовали одну копию R - так или иначе имеют загрузку P1 R в регион в памяти (это отображается в P1 и P2 в том же адресе), затем P1 и P2 могут оба получить доступ к объектам в R как объекты C++ (никакие условия состязания, так как все только для чтения).

Кто-либо знакомый, как сделать это / глюки?

5
задан Jonathan Leffler 18 January 2010 в 06:33
поделиться

4 ответа

На самом деле что-то подобное было просило и решено до :

и лучший ответ, вероятно, будет работать для вас: Используйте Boost Build Intercorcess Библиотеку . Хотя вы все еще не можете использовать объекты с виртуальными функциями (противный указатель VTable вне общей проблемы с общей памятью), у них есть инструменты, позволяющие использовать интеллектуальные указатели на другие объекты внутри общей памяти, а также пользовательские распределители, которые выделяют внутри общей памяти для создания std :: Вектор и std :: объекты карты.

5
ответ дан 14 December 2019 в 08:51
поделиться
-

Если я понимаю, что на странице человека, кажется, что функция функция MMAP позволяет отображать файл, совместно используемую память или другую вещь, в вашем процессе На конкретном виртуальном адресе Если вы предоставляете несколько страшных звучащих опций Map_Fixed. Поиск на странице «Человек» для MAP_FIXED, и вы найдете много предупреждений (возможно, не поддерживаются, могут сделать MALLOC больше не работать и т. Д.). Но если бы вы могли получить его на работу, общие объекты могут иметь указатели друг на друга.

1
ответ дан 14 December 2019 в 08:51
поделиться

Это так просто, как это:

#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>

// ...

int fd = open("memfile.txt",O_RDWR);
struct stat info;
fstat(fd, &info);
void * page = mmap(0, info.st_size, PROT_READ , MAP_SHARED, fd, 0);

Теперь вы можете использовать все, что вы храните в Memfile.txt в качестве структуры, и она будет передана между процессами.

Примечание Как и другие, вы не можете использовать указатели между объектами внутри этого куска памяти.

Это работает для меня на ОС X 10.4, но должно работать над любой системой совместимости BSD.

0
ответ дан 14 December 2019 в 08:51
поделиться

Как объекты внутри R указывают друг на друга? Если' по отношению к текущему положению объектов', можно воспользоваться общей памятью . Нет способа, чтобы эта разделяемая память загружалась внутри обоих процессов P1 и P2 по одному и тому же адресу. Поэтому работает только относительная. А так как вы сказали, что никто из них не будет пытаться модифицировать ее и просто читать из нее, то, думаю, вам не нужно защищать ее, используя либо семафор/мутекс.

1
ответ дан 14 December 2019 в 08:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: