在另一个进程内从内存执行进程?

Fli*_*lip 5 c c++ linux memory

我想有一个小的"应用程序加载器"程序,它通过TCP从外部服务器接收其他二进制应用程序文件并运行它们.

我可以通过将传输的文件保存到硬盘并使用system()调用来运行它来完成此操作.但是,我想知道是否有可能从内存中启动新应用程序而不会触及硬盘驱动器.

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

Fle*_*exo 5

简短的回答:没有。

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

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

我最近使用的替代方法是不传递完整的编译二进制文件,而是传递 LLVM 字节码,然后可以将其 JIT/解释/保存为合适的。这还具有使您的应用程序在异构环境中工作的优势。

尝试组合fmemopen,fileno和可能很诱人fexecve,但这不会起作用,原因有两个:

  1. fexecve()联机帮助页:

    “文件描述符 fd 必须以只读方式打开,并且调用者必须有权执行它所引用的文件

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

  2. fmemopen()联机帮助页:

    “没有与这些函数返回的文件流相关联的文件描述符(即,fileno(3)如果在返回的流上调用将返回错误)”