Как я могу проверить, удален ли объект общей памяти boost или нет?

Я использую boost::interprocess::shared_memory_object между процессами.

Процесс (сервер) создает объект общей памяти, а другие процессы (клиенты) открывают этот объект общей памяти. Но как клиентские процессы могут определить, удален ли этот объект общей памяти серверным процессом?

Как указано в документации по Boost, когда запрашивается удаление разделяемой памяти, она не будет удалена до тех пор, пока все другие ссылки не отменят ее. Таким образом, даже если серверный процесс (пытается) удалить объект общей памяти, этот объект общей памяти не удаляется, и поэтому другие клиентские процессы не могут знать, был он удален или нет.

Мне нужно такое обнаружение удаления из-за кеширования ссылок. Я имею в виду, что клиентские процессы сохраняют ссылку на разделяемую память и повторно используют ее при необходимости. Но когда серверный процесс удаляет общую память и воссоздает ее с тем же именем, я просто хочу, чтобы мои клиентские процессы обнаруживали это воссоздание и обновляли ссылку на вновь созданный объект общей памяти.


person Daniel K.    schedule 27.04.2011    source источник
comment
вы можете отслеживать использование общей памяти с помощью команды unix ipcs, хотя это может не помочь в вашем деле   -  person Arunmu    schedule 27.04.2011


Ответы (2)


Вы можете включить флаг в свой объект общей памяти, который указывает, использует ли ваш серверный процесс его.

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

Кроме того, я не думаю, что серверному процессу будет разрешено воссоздавать общий объект с тем же именем, пока он не будет удален, поскольку я уверен, что имена должны быть уникальными.

person GrahamS    schedule 27.04.2011
comment
Но сервер может воссоздать общую память, используя то же имя, потому что, когда запрашивается удаление, а другие ссылаются на него, он просто меняет имя внутреннего объекта, чтобы оно не конфликтовало с исходным именем. В моем эксперименте на Win32 имя файла подкачки было изменено на какое-то случайное (?) Имя при удалении. Кроме того, в документации по ускорению говорится (и требуется), что воссоздание с использованием того же имени будет успешным в любом случае. - person Daniel K.; 28.04.2011

Команда

ipcs -m

отобразит все существующие сегменты общей памяти. По shmid вы сможете идентифицировать свой сегмент. Также есть столбец nattch, показывающий количество процессов, присоединенных к сегменту.

person dimba    schedule 27.04.2011