Повышение срока действия общей памяти

Я использую Boost Shared Memory для совместного использования вектора между процессами.

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

Будет ли Open_Only выйти из строя, если сегмент памяти не существует, и если да, то как мне отловить этот сбой?

Также предполагается удалить сегмент разделяемой памяти, если на него нет ссылок. Однако в моем случае, даже когда и клиент, и сервер выключены, и ничто другое не обращается к общей памяти, сегмент остается в папке Boost Interprocess в данных программы с некоторыми данными. Таким образом, при следующем запуске клиента у него нет проблем с открытием сегмента, поэтому он думает, что получает доступ к правильным данным, хотя на самом деле данных для совместного использования нет.

Добрый совет. Спасибо.


person user1173240    schedule 12.03.2014    source источник


Ответы (1)


Исходя из опыта работы с базовым shm api - а не как эксперт по Boost ...

Чтобы определить достоверность, один из способов состоит в том, чтобы выяснить, является ли текущий процесс тем, который создает общую память (в первый раз). Вы можете сделать это, получив размер после создания (fstat) и проверив, равен ли размер нулю. Если он равен нулю, процесс его создает. Как только вы узнаете, что можете инициализировать его. Кроме того, когда вы вызываете truncate (), чтобы установить здесь размер, этот размер устанавливается для всех других процессов.

Чтобы гарантировать удаление, вы можете вызвать shm_unlink (), чтобы удалить файл общей памяти из системы. Я верю, что в Boost есть api remove (), который сделает это.

person YasserAsmi    schedule 12.03.2014
comment
Насчет размера я не уверен. В некоторых случаях я получал размер как 0, но емкость как правильное число. Так что не уверен, что могу использовать это как проверку. В Boost есть разрушитель сегментов, но он работает только в том случае, если все ссылки на него удалены. Итак, если сервер ничего не нажимает и отключился, что говорит клиенту перестать обращаться к общей памяти и сигнализировать об ошибке? - person user1173240; 13.03.2014
comment
На уровне разделяемой памяти нет механизма, который сообщает клиенту об отключении сервера. На самом деле нет понятия сервер против клиента. По сути, это просто часть памяти, разделяемая между процессами. На нем построены другие механизмы. Ваш файл shm отображается в папке / dev / shm, пока он используется? - person YasserAsmi; 14.03.2014
comment
Другая идея состоит в том, чтобы время от времени записывать какое-то постоянно увеличивающееся число (временную метку?) В общую память. И сравните это с ценностями клиентов. - person YasserAsmi; 14.03.2014
comment
Спасибо за предложение. Я надеялся, что будет более простой метод, но я полагаю, что этого придется сделать, если я не раскрою что-нибудь еще. - person user1173240; 20.03.2014