我想要一个小的“应用程序加载器”程序,该程序可以通过TCP从外部服务器接收其他二进制应用程序文件并运行它们。
我可以通过将传输的文件保存到硬盘上并使用system()调用来运行它来完成此操作。但是,我想知道是否有可能从内存中启动新应用程序而不接触硬盘驱动器。
加载新应用程序后,加载程序应用程序的状态无关紧要。我更喜欢使用C,但是也欢迎使用C ++解决方案。我还要坚持使用标准Linux C函数,并且尽可能不使用任何外部库。
简短的回答:不。
长答案:不写到磁盘就可以这样做,但很棘手。从理论上讲,您可以编写自己的elf加载器,该加载器读取二进制文件,映射一些内存,根据需要处理动态链接,然后转移控制权,但这需要进行大量工作,这几乎是不值得的。
下一个最佳解决方案是将其写入磁盘并尽快调用取消链接。该磁盘甚至不必是“实际”磁盘,它可以是tmpfs或类似磁盘。
我最近使用的替代方法是不传递完整的已编译二进制文件,而是传递LLVM字节码,然后可以将其适当地进行JIT /解释/保存。这还具有使您的应用程序在异构环境中工作的优势。
它可能是很有诱惑力尝试的组合fmemopen,fileno并且fexecve,但这并不原因有二:
fmemopen
fileno
fexecve
fexecve()
“文件描述符fd必须以只读方式打开,并且调用者必须有权执行 它所引用的文件 ”
即它必须是引用文件的fd。
fmemopen()
“没有与这些函数返回的文件流关联的文件描述符(即,fileno(3)如果在返回的流上调用将返回错误)”
fileno(3)