我想要一个小的“应用程序加载器”程序,该程序可以通过TCP从外部服务器接收其他二进制应用程序文件并运行它们。
我可以通过将传输的文件保存到硬盘上并使用system()调用来运行它来完成此操作。但是,我想知道是否有可能从内存中启动新应用程序而不接触硬盘驱动器。
加载新应用程序后,加载程序应用程序的状态无关紧要。我更喜欢使用C,但是也欢迎使用C ++解决方案。我还要坚持使用标准Linux
C函数,并且尽可能不使用任何外部库。
简短的回答:不。
长答案:不写到磁盘就可以这样做,但很棘手。从理论上讲,您可以编写自己的elf加载器,该加载器读取二进制文件,映射一些内存,根据需要处理动态链接,然后转移控制权,但这需要进行大量工作,这几乎是不值得的。
下一个最佳解决方案是将其写入磁盘并尽快调用取消链接。该磁盘甚至不必是“实际”磁盘,它可以是tmpfs或类似磁盘。
我最近使用的替代方法是不传递完整的已编译二进制文件,而是传递LLVM字节码,然后可以将其适当地进行JIT
/解释/保存。这还具有使您的应用程序在异构环境中工作的优势。
它可能是很有诱惑力尝试的组合fmemopen
,fileno
并且fexecve
,但这并不原因有二:
fexecve()
联机帮助页:“文件描述符fd必须以只读方式打开,并且调用者必须有权执行 它所引用的文件 ”
即它必须是引用文件的fd。
fmemopen()
联机帮助页:“没有与这些函数返回的文件流关联的文件描述符(即,
fileno(3)
如果在返回的流上调用将返回错误)”
问题内容: 作为程序的一部分,我有一个连接管理器,该管理器从客户端接收连接,然后为客户端提供用于连接的端口号和密码。这时经理需要调用jar文件,我必须使用一些参数来处理此连接,然后继续操作(忽略其他程序在做什么)。 我的问题一直在执行jar文件。我查找了类似的问题,并尝试使用流程生成器和Runtime.exec。我在jar文件中移动,并检查了它的权限。它只是拒绝在另一个Java程序中工作,而在命令
问题内容: 这是我的代码: 您可以看到我要执行的操作,但是我不确定如何正确编写此查询。 我得到的继承人错误: 警告:mysql_fetch_assoc():提供的参数不是有效的MySQL结果资源 这是我的mysql_fetch_assoc: 问题答案: 尝试改变…的喜欢 …至…
问题内容: 我想在我的Java程序中读取c-Application的输出流。 iremoted (可在此处获得:http : _//osxbook.com/software/iremoted/download/iremoted.c_ )是一个C应用程序,如果按下了Apple Remote遥控器上的按钮,它将显示诸如“ 0x19按下”的单独行。如果我启动改头换面的程序,那么一切都会很好,每当我按下一
问题内容: gdb如何在Linux上访问另一个进程虚拟内存?全部通过/ proc完成吗? 问题答案: gdb如何在Linux上访问另一个进程虚拟内存?全部通过/ proc完成吗? 在Linux上读取内存 : 1)如字节数来读取比更少或文件系统不可用或从读取不成功则使用具有读取数据。 这些是函数中的这些条件: 2)如果要读取的字节数大于或等于3 * sizeof(long)并且可用,则使用或(和使用
问题内容: 我想在另一个goroutine中运行一些缓慢的例程,这样做是否安全: 这样做有什么陷阱吗? 问题答案: 服务每个http请求都在其自己的goroutine中运行。您可以从处理程序中启动新的goroutine,它们将并发运行,与执行处理程序的goroutine独立。 要注意的一些事情: 新的goroutine与处理程序goroutine独立运行。这意味着它可能在处理程序goroutine
我如何在服务器的另一个存储过程中执行SQL存储过程?我将如何传递第二个过程的参数。?