Деструктор конструктора инициализации общего объекта C

#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 вести себя так, как он ведет себя в настоящее время