динамическая переменная со статическим поведением при загрузке библиотек с использованием dlopen - PullRequest
2 голосов
/ 05 ноября 2011

У меня есть глобальная переменная, определенная в c-библиотеке [ex: int globalcount = 0] и в функции инициализации библиотеки [скажем, library_init] globalcount увеличивается на 1.

Проблема здесь в следующем: когда библиотека открывается с помощью dlopen и appln, вызывает функцию library_init и закрывает библиотеки с помощью dlclose, тогда снова вызов dlopen сбрасывает globalcount до 0.

Я хочу знать, как предотвратить сброс глобальной переменной [Я хочу, чтобы globalcount был 1, а не 0] при следующем вызове dlopen, поскольку процесс не завершается, поэтому глобальная переменная также не должна сбрасываться.

Если библиотека связана с процедурой использования -l во время ссылки, я не сталкиваюсь с проблемой abv. проблема только когда библиотеки открываются с помощью dlopen / dlclose [несколько раз]

ОС - это Linux Прог Лан: C Компилятор: gcc

Как это сделать, память в сегменте данных не должна освобождаться при вызове dlclose?

Ответы [ 2 ]

1 голос
/ 05 ноября 2011

Когда вы вызываете dlclose, ваша dll выгружается, что означает, что любая память в сегменте данных вашей библиотеки освобождается.По этой причине значение сбрасывается на 0. Вы можете использовать разделяемую память , чтобы иметь постоянную переменную даже при выгрузке библиотеки.

0 голосов
/ 06 марта 2014

Используйте флаг RTLD_NODELETE при загрузке библиотеки с использованием dlopen.глобальные и глобальные статические переменные сохраняются в памяти, когда мы используем этот флаг.Даже если счетчик ссылок библиотеки станет равным нулю.

...