【问题标题】:How can I modify the application file of an application that is currently running (on Linux)?如何修改当前正在运行的应用程序的应用程序文件(在 Linux 上)?
【发布时间】:2010-06-07 06:37:08
【问题描述】:

我有一个名为 AppFS 的应用程序正在运行。这个应用程序有一个 ext2 文件系统,它只是附加到文件的末尾(它的位置使得应用程序二进制文件存在于 1MB 的间距区域中,然后是 ext2 数据)。

现在我已经在程序中嵌入了 FUSE,并且我已经成功地将文件系统从应用程序数据中提取到一个临时文件中,以便 FUSE 可以挂载/使用它。

我现在遇到的问题是将临时文件写回应用程序文件中。我得到“文本文件忙”大概是因为应用程序已锁定自身并且不会让写入发生。

有没有办法强制文件解锁,以便我可以向其中写入数据? (需要注意的是,我并没有更改应用程序的二进制区域 - 只是重写了 ext2 组件。)它需要在不需要 root 权限的情况下解锁(由启动应用程序的同一用户解锁)。

【问题讨论】:

  • 我想这里的问题是启动应用程序的用户不一定与拥有二进制文件的用户相同。您真的需要将ext2 数据嵌入到二进制文件中吗?
  • 从二进制文件中拆分 ext2 或在运行完整的可执行文件(附加 ext2)或仅提取文件中的可执行文件,运行它,然后使用另一个可执行文件(附加 ext2)作为文件系统的文件。
  • 可执行部分和 ext2 组件之间的分离对于操作系统来说可能并不明显。它怎么知道对文件进行字节范围锁定?它需要锁定可执行部分,因为它可能会在 RAM 不足时从内存中丢弃。

标签: c++ c linux locking io


【解决方案1】:

解决此问题的方法是重命名现有应用程序名称(到临时目录中的某个位置),然后将新(生成的)文件移回原处并应用与旧应用程序相同的 umask / uid / gid一个有。移动后,您可以安全地取消链接正在运行的可执行文件。

这是一个有点笨拙的解决方法(我特别不喜欢应用程序被完全删除和替换的事实),但它确实有效。

【讨论】:

    【解决方案2】:

    我会做什么:

    1. 启动 AppFS
    2. 将可执行部分提取到文件中(不带 FS)
    3. 运行提取的可执行文件,将原始可执行文件作为参数(附加 FS)
    4. 提取的程序修改原始可执行文件(没问题 - 可执行文件不再运行)
    5. 退出时自行删除解压程序

    你需要做什么:

    1. 修改 AppFS 应用程序,使其执行之前枚举中的步骤 2、3、4 和 5。

    我没有看到任何其他方法可以做到这一点。这种架构类似于SFX 的架构。

    【讨论】:

    • 实际上 AppFS 应用程序运行一个 FUSE 文件系统,因此无法停止。尽管如此,我已经解决了自己的问题,并将在下方/上方附上解决方案。
    猜你喜欢
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多