c - C 应用程序如何在运行时在 Linux 环境中更新自身

标签 c linux

首先我想问一下应用程序是否有可能在运行时在相同的地址空间上更新自身? 如果是,实现逻辑的最佳方法是什么? 用例:我的应用程序在连接到网络的板上运行。在运行时,如果它检测到同一应用程序的新版本,那么如何在存储前一个应用程序的同一内存地址上更新应用程序。 根据我的理解,首先我们应该备份更新,在引导加载时,主应用程序应该用备份更新,然后正常启动应用程序。我说得对吗?

最佳答案

通常您可以在运行时替换包含可执行文件的文件而不会出现问题。

更新文件后,您可以像往常一样启动应用程序,然后关闭正在运行的实例。

但是,如果您想在运行时执行此操作(即不 fork 或启动新进程),我认为如果没有非常奇怪的黑客攻击是不可能的:

  • 如果您计划用新的可执行代码“重新设置”您的程序内存,您需要计算每个线程的堆栈、内存和指令指针。你需要成为一名反汇编者。
  • 如果您计划在将 stub 加载到辅助内存段后调用程序中的 stub ,那很好,但是您需要弄清楚目标函数在哪里,以及如果它在您的下一次更新中消失了会发生什么。此外,它完全是特定于平台的。
  • 如果您计划通过使用动态加载和卸载的共享库来标准化上述方法,我认为没有问题 - 这与您重新启动整个过程的方法非常相似。

如果我有充分的理由,我会只替换可执行文件或第三个选项。最后一个选项很好,因为它允许您单独更新应用程序的组件(但与此同时,这可能会让您在以后的维护中头疼。)

关于c - C 应用程序如何在运行时在 Linux 环境中更新自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30774314/

相关文章:

java - 最近未使用(NUR)页面替换算法

C fscanf 读取指向字符数组的指针

linux - 如何使用 sh 脚本正确读取文件并在 if 语句中使用它?

linux - 执行sed命令时出错

php - 路径在容器内不可写

c - 不知道为什么我会收到链接错误

c - Matlab 到 C 的移植

c - 将二维数组从 Fortran 传递到 C

linux - 使用 systemd 登录后启动 autofs

linux - 如何从脚本内部获取 BASH 脚本的完整调用命令(不仅仅是参数)