Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перезагрузка обновленной библиотеки 
:(
    Опции темы
admsasha
Дата 6.12.2017, 03:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



Требуется сделать без перезапуска программы обновление плагинов, которые реализованы через библиотеки.

Тестовый код простой
Код

    void* handle = dlopen("libs/test.so", RTLD_LAZY);
    sleep(5);
    dlclose(handle);


Проблема в том, что если во время sleep переписать libs/test.so, то программа на dlclose(handle) упадет. Как корректно завершить или отловить это событие ? Как почистить память от этой библиотеки, даже если она физические была заменена ?
PM MAIL WWW ICQ Jabber   Вверх
xvr
Дата 6.12.2017, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(admsasha @  6.12.2017,  03:48 Найти цитируемый пост)
Проблема в том, что если во время sleep переписать libs/test.so, то программа на dlclose(handle) упадет. 

Если test.so именно переписать, то всё упадет не доходя до dlclose. Удалите сначала сам файл с test.so, а потом создавайте заново - должно работать.
Если хотите, что бы ваша программа не зависила от перезаписи в полёте, то копируйте test.so во внутреннюю директорию (предварительно стерев оттуда предыдущую версию) и делайте dlopen оттуда

PM MAIL   Вверх
admsasha
Дата 7.12.2017, 03:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



Цитата(xvr @  6.12.2017,  20:51 Найти цитируемый пост)
Если test.so именно переписать, то всё упадет не доходя до dlclose. Удалите сначала сам файл с test.so, а потом создавайте заново - должно работать.
 Нет, это не помогат. Как видно из кода, следующая операция после sleep закрытие библиотеки. 

Цитата(xvr @  6.12.2017,  20:51 Найти цитируемый пост)
Если хотите, что бы ваша программа не зависила от перезаписи в полёте, то копируйте test.so во внутреннюю директорию (предварительно стерев оттуда предыдущую версию) и делайте dlopen оттуда
 Вот я так же подумывал. И скорее всего и придется так делать. Не очень красивое решение.

PM MAIL WWW ICQ Jabber   Вверх
xvr
Дата 7.12.2017, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(admsasha @  7.12.2017,  03:43 Найти цитируемый пост)
 Нет, это не помогат. Как видно из кода, следующая операция после sleep закрытие библиотеки. 

Это не важно. Важно то, что библиотека при dlopen мапируется в память, и если вы ее в это время начинаете менять на файловой системе (например переписывать), то может измениться и образ в памяти (это зависит от того, как динамический загрузчик мапировал библиотеку в память). А dlclose потом полезет читать рантайм динамические данные, что бы удалить инфу о загруженной библиотеке из памяти. Если образ был изменен, то тот мусор, который прочтет линкер, может сломать всё.

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

PM MAIL   Вверх
admsasha
Дата 9.12.2017, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: 1
Всего: 6



PM MAIL WWW ICQ Jabber   Вверх
xvr
Дата 11.12.2017, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Не баг, а фича. Там же написано, что так и должно быть.

 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1139 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.