Подтвердить что ты не робот

Замена исполняемого исполняемого файла в Linux

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

ОК, чтобы заменить исполняемый файл во время работы программы, если вы сначала rm (unlink).

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

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

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

Ответ 3

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

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