gpt4 book ai didi

c++ - 从另一个进程中的内存执行一个进程?

转载 作者:IT王子 更新时间:2023-10-29 00:36:22 25 4
gpt4 key购买 nike

我想要一个小型“应用程序加载器”程序,它通过 TCP 从外部服务器接收其他二进制应用程序文件并运行它们。

我可以通过将传输的文件保存到硬盘并使用 system() 调用来运行它来做到这一点。但是,我想知道是否可以在不接触硬盘的情况下从内存中启动新应用程序。

加载器应用程序的状态在加载新应用程序后无关紧要。我更喜欢坚持使用 C,但也欢迎使用 C++ 解决方案。如果可能的话,我还想坚持使用标准的 Linux C 函数,不使用任何外部库。

最佳答案

简短的回答:没有。

长答案:在不将其写入磁盘的情况下执行此操作是可能的,但相当棘手。理论上,您可以编写自己的 elf 加载程序来读取二进制文件、映射一些内存、根据需要处理动态链接,然后转移控制权,但这是一项非常多的工作,几乎不值得付出努力。

下一个最佳解决方案是将其写入磁盘并尽快调用取消链接。磁盘甚至不必是“真实”磁盘,它可以是 tmpfs 或类似的磁盘。

我最近一直在使用的替代方案是不传递完整的编译二进制文件,而是传递 LLVM 字节码,然后可以根据需要进行 JIT/解释/保存。这还具有让您的应用程序在异构环境中工作的优势。

尝试组合使用 fmemopenfilenofexecve 可能很诱人,但这行不通有两个原因:

  1. 来自 fexecve() 联机帮助页:

    "The file descriptor fd must be opened read-only, and the caller must have permission to execute the file that it refers to"

    即它需要是一个引用文件的 fd。

  2. 来自 fmemopen() 联机帮助页:

    "There is no file descriptor associated with the file stream returned by these functions (i.e., fileno(3) will return an error if called on the returned stream)"

关于c++ - 从另一个进程中的内存执行一个进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10523681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com