Последствие процесса, не вызывающего shm_unlink - PullRequest
0 голосов
/ 27 ноября 2018

В моей программе 2 процесса: ведущий и ведомый.Ведущий связывается с ведомым через буфер общей памяти.Мастер создает разделяемую память с помощью

shm_open("shared_buff", O_CREAT | O_RDWR, 0666);

Ведомый использует ту же самую строку shm_open, чтобы получить свой указатель в бафф.Хозяин может убить подчиненное устройство, прежде чем у него будет возможность корректно завершить работу и вызвать shm_unlink () в буфере общей памяти.Мне интересно, может ли это вызвать утечку памяти, и если да, то есть ли что-то, что я могу с этим поделать?

В настоящее время я сталкиваюсь с ошибкой, когда после того, как мастер убил ведомого и попытался перезапустить его,ведомый больше не имеет доступа к буферу.Я не уверен на 100%, является ли это причиной проблемы, но кажется вероятным.Чтобы было ясно, все работает нормально на первом проходе, только во второй раз, когда ведомое устройство запускается, возникают проблемы.Насколько я могу судить, ошибок или следов стека не выводится.

Другое решение было бы для недавно связанного общего объекта mem (на конце ведомых) просто заменил бы старое распределение.возможно ли что-то подобное?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Если и главный, и подчиненный процессы открывают общую память, используя O_CREAT, и одному из процессов удается успешно вызвать shm_unlink, то следующий вызов shm_open создаст новый объект общей памяти, отличный отпервый (небольшой пункт в описании shm_unlink справочной страницы).Я подозреваю, что это то, что вы видите во второй раз.

Я бы предложил, чтобы только главный процесс отвечал за создание объекта общей памяти с использованием O_CREAT и O_EXCL (и настройку файларазмер и т. д.).Затем подчиненный процесс должен открыть общую память, используя O_RDWR (или что-либо еще подходящее), а затем использовать close, чтобы избавиться от дескриптора файла (либо контролируемым образом, либо ядром, когда подчиненный процесс убит).Все, что делает sm_unlink, это удаляет имя объекта общей памяти из пространства имен имен объектов общей памяти (точно так же, как unlink просто удаляет имя файла из каталога), и это должно быть сделано мастером как часть его изящности (созданиеобязательно поймать сигналы соответственно) выключение.

0 голосов
/ 27 ноября 2018

Общая память SysV является глобальным общесистемным ресурсом.Если вы не отпустите его, когда закончите с этим, в конце концов вы закончите.

...