LINUX.ORG.RU

Обновление *.so во время runtime

 , ,


0

1

Здравствуйте. По прежнему контекст - разработка окружения рабочего стола, в частности, вопрос, относящийся к панели. Апплеты будут динамически подключаемыми *.so библиотеками. Но если в то время, как панель запущена, подменить *.so файл, то при любом взаимодействии с апплетом (а они еще бывают динамические, которые обновляются постоянно), панель крашится. Оно бы все ничего, но в дальнейшем, при обновлении системы, апплеты же тоже будут обновляться (и, возможно, апплеты, которые не входят в состав проекта, а написаны обычными людьми). И сразу же панель крашнется. У меня будет отдельный компонент, который ответственен за запуск сессии, в том числе и панели, и он сможет ее перезапустить, но это какой-то костыль. Есть еще идея при загрузке апплета скопировать его в /tmp, но это тоже как-то так себе вариант, мне кажется (особенно в плане легковесности). Подскажите, пожалуйста, как лучше поступить в данной ситуации, или где можно почитать решение этой проблемы в исходниках других проектов


По-моему вам рано разрабатывать окружение рабочего стола, если вы не до конца понимаете, как работать с динамически подключаемыми библиотеками а также момент, что в linux/unix системах при открытом дескрипторе можно удалить файл и заменить его на другой - загруженный экземпляр всё еще старый.

PPP328 ★★★★★
()

подменить *.so файл

А что значит подменить? Насколько я понимаю, если удалить файл и пересоздать, то ничего не будет крашиться, потому что оригинальная сошка вообще никак не трогается. Но будет крашиться если перезаписать сошку не удаляя её.

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

anonymous
()
Ответ на: комментарий от PPP328

По-моему вам рано разрабатывать окружение рабочего стола, если вы не до конца понимаете, как работать с динамически подключаемыми библиотеками

А вам рано писать на форум, если вы не до конца понимаете что люди не знают всё сразу, а знания приходят именно и только в процессе разработки.

anonymous
()
Ответ на: комментарий от PPP328

то, что я чего-то не знал про динамически-подключаемые библиотеки, еще не говорит о том, что я не писал

простые вещи - блокноты, парсеры json

это уже давным-давно пройденный этап

мой проект существует уже 3 года, но вынести апплеты в отдельные библиотеки я решил только сейчас

thm
() автор топика
Ответ на: комментарий от PPP328

Все эти блокноты и парсеры json в хер никому не упились. А ДЕ на практике показывает что надо и как надо. Это не такая сложная вещь, как кажется, зато используемая на практике.

LightDiver ★★★★★
()
Ответ на: комментарий от anonymous

Насколько я понимаю, если удалить файл и пересоздать, то ничего не будет крашиться, потому что оригинальная сошка вообще никак не трогается

попробую

thm
() автор топика
Ответ на: комментарий от PPP328

Ну так чтобы учиться надо писать простые вещи - блокноты, парсеры json

Нет, не надо. Надо сразу писать полноценные проекты - кому-то нужные и с реальными задачами.

anonymous
()
Ответ на: комментарий от anonymous

Пока у вас нет ни опыта ни знаний и возникают вопросы «как мне релоаднуть .so» - то ваш «реальный проект» не будет никому нужен. По причине плохого проектирования и кода (из-за отсутствия знаний).

PPP328 ★★★★★
()
Ответ на: комментарий от PPP328

Пока у вас нет ни опыта ни знаний и возникают вопросы «как мне релоаднуть .so» - то ваш «реальный проект» не будет никому нужен. По причине плохого проектирования и кода (из-за отсутствия знаний).

Во-первых, нет, проект не становится не нужен из-за того что там как-то не так обновляются сошки и что-то там крашится. Во-вторых, даже если не нужен - так блокноты с json парсерами тоже никому не нужны. Только у реального проекта, в отличие от, есть шансы быть/стать нужным, и на нём приобретается настоящий опыт вот собственно в проектировнии кода.

По причине плохого проектирования и кода

А не х-ня которая никогда в жизни не понадобится, типа написания блокнотов и json парсеров.

anonymous
()
Ответ на: комментарий от necromant

Как раз такие и взлетают с кодом написанным на коленке, что самое прискорбное, в не идеальный спроектированный «собор»

А что в этом прискорбного? Либо написанное на коленке, либо никакое. Первое, во-первых, уже работает, во-вторых - рефакторится и вылизывается и автором и контрибуторами кому оно интересно. А второе просто никогда не покинет голову доморощенного проектировщика-теоретика.

anonymous
()

Апплеты будут динамически подключаемыми *.so библиотеками.

Отказать. Это путь, полный страданий и непредсказуемых проблем. Либо статическая линковка, либо, как написали выше, подпроцессы и IPC.

anonymous
()
Ответ на: комментарий от anonymous

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

подпроцессы можно, подумаю в эту сторону, но класс PlainApplet у меня принимает указатели на объекты, которые передаются панелью, как это тогда передавать - не ясно (а оно нужно, как минимум, для задания корректной геометрии выпадающего меню апплета)

thm
() автор топика
Ответ на: комментарий от thm

попробовал, работает

Что пробовал и что работает?

но разве пакетный менеджер сначала удаляет файлы, а потом копирует новые?

Пакетных менеджеров много, они могут вести себя как угодно. Но должны сначала создавать новый файл рядом, потом удалять старый, и наконец мувать новый на место старого. Кажется последние два шага можно делать атомарно. К сожалению, консистентность между разными файлами пакета таким образом сохранить нельзя, но каждый отдельный файл будет в консистентном состоянии - либо старом, либо новом. Не будет отсутствующим или частично дописанным, и не будет проблем что mmap’нутый файл изменяется наживую.

anonymous
()
Ответ на: комментарий от anonymous

Что пробовал и что работает?

попробовал сначала rm /path/to/library, а потом на то же место положить новую. панель не крашится, все хорошо

Но должны сначала создавать новый файл рядом, потом удалять старый, и наконец мувать новый на место старого.

хорошо, изучу этот вопрос подробнее, погуглю

thm
() автор топика
Ответ на: комментарий от PPP328

А не пытаться сразу улететь на Марс зная устройство примитивного парового двигателя.

Полеты на паровом двигателе на Марс — это то что с современным ойти происходит прям щас, ну ты чо.

slackwarrior ★★★★★
()