#c #c 11 #shared-libraries
#c #c 11 #разделяемые библиотеки
Вопрос:
Я работаю над общим объектом, скомпилированным с g
помощью, который служит в качестве API ведения журнала. Я написал небольшую утилиту для использования библиотеки, но обнаружил, что конструктор / деструктор общего объекта вызывается каждый раз при запуске и выходе программы. Я хотел бы иметь возможность поддерживать состояние любых переменных / объектов в .so
файле, даже если нет связанных активных приложений. Существует ли механизм для достижения этого?
Ответ №1:
Я хотел бы иметь возможность поддерживать состояние любых переменных / объектов в файле .so, даже если нет связанных активных приложений. Существует ли механизм для достижения этого?
В современной ОС все, что находится в памяти, «принадлежит» одному или нескольким процессам, и нет такого понятия, как « .so
без активного приложения».
Кроме того, когда ваш .so
объект связан с несколькими активными приложениями (запущенными процессами), по-прежнему нет общего состояния, которое ваша библиотека может записывать — у каждого вашего экземпляра .so
не будет возможности наблюдать, что другие экземпляры этого .so
активны в других процессах, кроме как с помощью некоторого IPC
механизма.
Вы можете создать сегмент общей памяти с помощью shmat и записать в него общее состояние. Это состояние также будет сохраняться до явного удаления с помощью системного вызова smtctl.
Осторожно: использование разделяемой памяти таким образом чревато осложнениями и, скорее всего, является излишним для библиотеки API ведения журнала.
Комментарии:
1. спасибо за ответ, я пытался использовать метод общей памяти, о котором вы упомянули, но библиотека ведения журнала, которую я создаю, интенсивно использует
shared_ptr
s. Итак, если один процесс создал приемник, а другой разыменовывает указанный приемник ….. segfault. Возможно, просто придется отказаться от цели системного уровня и заставить API вести себя так, как он ведет себя в настоящее время