LINUX.ORG.RU

[C++/Qt] обновление запущенной программы


0

2

Пишу обновлялку для одного из своих проектов.

Заметил что в генте отлично сделано обновление программ. Файлы замещаются, а работающая в тот момент программа никак от этого не страдает.
Как это сделано??

Ведь, просто так, попытавшись заменить файл получаем ошибку:
cp: невозможно создать обычный файл «/usr/local/bin/progname»: Текстовый файл занят

А через:
install -m 755 -p «progname» «/usr/local/bin/progname»
Всё работает отлично.

В чём же всётаки разница в этих программах?
И как реализовать подобное на qt? Интересует прежде всего кроссплатформенная реализация.

> Интересует прежде всего кроссплатформенная реализация.

Под оффтопиком ты такого не реализуешь.

anonymous
()

Вот тебе разница между cp и install:

-open("../test/test", O_WRONLY|O_TRUNC|O_LARGEFILE) = -1 ETXTBSY (Text file busy)
+open("../test/test", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE, 0755) = 4

anonymous
()

я реализовывал так... делал программу стартер, которая запускала файл например qstarter запускала qtbase, если находила qtbase-new писала что есть обновление и если че перезапускала программу подменяя qtbase на qtbase-new.

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

что не мешает его переименовать, но подчищать всё равно придётся, конечно

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

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

TERRANZ ★★★★
()

>Файлы замещаются, а работающая в тот момент программа никак от этого не страдает.

Как это сделано??

Это магия Unix.

yoghurt ★★★★★
()

Мы делали так: после закрытия программы запускалась хератень, которая перетаскивала ранее скаченные файлы на место

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

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

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

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

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

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

нах! обновлятор консольный делай он не будет либы юзать он сам по себе будет

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

Будте добры, не употребляйте слова «линух», «лялих» и т.п. Используйте слово «линукс».

nanoo_linux
()

В Линуксе можно изменить или удалить открытый файл. Например, если файл удалили, то он удалится с ФС только после того, как все программы его закроют. Новые программы его открыть уже не смогут, а старые будут продолжать с ним работать. Аналогично с изменением - новые программы откроют изменённую версию файла, а те программы, в которых файл был открыт до изменения, будут продолжать работать со старым содержимым.

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

кстати если под вендой хочешь сделать гуйный обновлятор но не Qt юза c++ builder какойнибудь старенькой версии.. как вариант..

pozitiffcat ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.