Замена работающего исполняемого файла в Linux - PullRequest
22 голосов
/ 11 ноября 2009

У меня есть встроенная система Linux, которая может обновляться с карты USB. Интерфейсная программа обнаруживает вставку USB и ищет обновленный исполняемый файл. В настоящее время я копирую его в локальный файл и устанавливаю некоторые команды в rc5.d, чтобы скопировать файл поверх существующего exe-файла при следующей загрузке. Тогда у меня есть перезагрузка программного обеспечения.

Есть ли лучший способ сделать это?

Ответы [ 3 ]

31 голосов
/ 11 ноября 2009

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

  • Копирование нового исполняемого файла в локальный файл.
  • Проверить локальный файл.
  • unlink () существующий исполняемый файл.
  • rename () новый исполняемый файл с правильным именем.

Приложение продолжит работу после unlink() - ядро ​​не выпустит базовые данные, пока не будут завершены все выполняющиеся копии.

Затем вы можете просто использовать execve(), чтобы текущий запущенный процесс заменил себя только что загруженной версией.

24 голосов
/ 11 ноября 2009

Можно заменить исполняемый файл во время работы программы ЕСЛИ вы rm ( отсоедините ) его первым.

Это не то, что происходит с cp, так что не используйте это. Либо mv файл, либо, если быть уверенным, rm его, а затем поместите новый в том же месте. Если вы делаете это с помощью кода во встроенном программном обеспечении, то unlink(2) - это то, с чего вы хотите начать.

Ядра Unix знают, что inode все еще используется, и они удаляют запись каталога для файла, но они не освобождают inode (и блоки данных), пока счетчик ссылок на inode не достигнет нуля, и это не победит это может произойти, пока работает его экземпляр.

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

10 голосов
/ 11 ноября 2009

В linux вы можете безопасно заменить исполняемый файл во время работы процесса. Пока процесс запущен, этот экземпляр будет продолжать использовать «старый» код. Все новые звонки в приложение будут использовать «новый» код. Таким образом, простой перезапуск приложения (или устройства при необходимости) будет использовать новую копию.

Обратите внимание, что вы должны быть осторожны, если ваше приложение изменит конфигурационные файлы или библиотеки, поскольку они могут не находиться в памяти. В этом случае безопаснее всего сделать так, чтобы скрипт выполнял то, что вы упомянули.

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