Как я могу проверить, удален ли общий объект памяти или нет? - PullRequest
3 голосов
/ 27 апреля 2011

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 27 апреля 2011

Команда

ipcs -m

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

2 голосов
/ 27 апреля 2011

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

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

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

...