【问题标题】:How to run a C++ program inside another C++ program?如何在另一个 C++ 程序中运行 C++ 程序?
【发布时间】:2013-07-07 13:35:49
【问题描述】:

我将在下面勾勒出我想要工作的场景。

我有一个主要应用程序。 该应用程序基于用户交互,可以在安全环境/外壳中加载其他应用程序。这意味着这些子应用程序不能再与操作系统交互,也不能相互交互。

父程序可以随时调用这些子程序的函数。 子程序可以随时调用这些父程序的函数。

有谁知道如何在 C++ 中实现这一点?最好父母和孩子都应该用 C++ 编写。

在父应用程序中加载子应用程序的性能并不重要。唯一重要的是孩子和父母在相互调用函数时的通信性能。

【问题讨论】:

  • fork() + exec() 系列函数会帮到你。
  • @monad-newb 是的,它们是预编译的。
  • @dmh 用户应该能够在运行时添加和删除子应用程序。
  • 没有标准的 C++ 方法可以做到这一点,答案必须是特定于操作系统的。请指定您的目标操作系统。
  • 听起来您需要某种虚拟机,否则预编译二进制应用程序的可靠沙盒化可能会很困难。但可能最好的方法是让孩子使用脚本语言,这样他们就只能做父母为他们做的事情。

标签: c++ linux shell


【解决方案1】:

您必须编写自己的编译器。

考虑:没有普通的操作系统支持你想要的。您希望两个可执行文件都在单个进程中运行,但该进程可能会或可能不会调用操作系统,具体取决于操作系统根本不理解的进程内部的一些怪异。

这不再是您的自定义编译器的问题,因为它根本不会创建有问题的指令。它类似于 Java 和 .Net,它们也可以防止此类操作系统调用超出其控制范围。

【讨论】:

  • 子进程无法访问操作系统。它们不必是可执行文件。它们可以是单独的进程,但这是否意味着您无法控制它们?
  • 它们不能是单独的进程。琐碎:你不能跨进程边界调用函数。
  • ...除非您将 RPC 机制视为函数调用(如果您说得足够松散的话,我想您可以)
【解决方案2】:

便携式解决方案:Google Native Client

一种可能的 Linux 解决方案:

  1. 使用“帽子”制作 AppArmor 配置文件(“帽子”是一种沙盒配置,应用程序可以使用 libapparmor 以编程方式切换到该配置),
  2. 让主应用程序创建一个“管道”,
  3. 拥有主应用“fork”,
  4. 改成子应用对应的“帽子”,
  5. “执行”子应用程序,
  6. 主应用程序和子应用程序通过之前创建的“管道”进行通信。

【讨论】:

  • 据我了解,这并不妨碍孩子与操作系统进行交互,这一点至关重要。
  • Binero,拥有“安全环境”和“防止孩子与操作系统交互”并不是一回事。后者大部分时间没有什么实用价值。
【解决方案3】:

如果您想要一种(半)跨平台的方式来执行此操作,您可以使用 RPC 来调用另一个进程中的函数。它适用于任何支持分布式计算环境的东西。它已经存在了一段时间,msdn 文档指出部分 Windows 使用它进行进程间通信,因此它可能足够快。这是一个关于 msdn 的教程,应该可以帮助您启动并运行 http://msdn.microsoft.com/en-us/library/windows/desktop/aa379010.aspx 糟糕的是,我还没有找到关于在 linux 上使用它的教程。

如果您不想使用 RPC 或发现很难找到有关该主题的良好文档,您可以使用 unix 系统中的标准 IPC(进程间通信)机制来通知您的进程应该调用某个函数.我推荐一个消息队列,因为它非常快速和轻量级。你可以在这里找到教程:http://www.cs.cf.ac.uk/Dave/C/node25.html

【讨论】:

    【解决方案4】:

    我不熟悉上述答案中的操作系统限制。但是,我找到了一个简单的方法来解决这个问题。我希望它有所帮助并且没有技术问题。我使用的是 Linux 操作系统。假设我想在另一个 C++ 程序 A 中调用 C++ 程序 B。我编写了一个 perl 脚本(例如 PerlScript.pl),其中包含运行程序 B 的系统调用。然后在 A 中,我做了一个系统调用,如 system("perl PerlScript.pl") 要求 perl 为我运行 B。

    【讨论】:

    • 以这种方式使用system会在代码中打开非常严重的漏洞,特别是如果运行它的人可以创建自己的 PerlScript.pl 文件并将其替换。也不支持这两个进程“随时调用彼此的函数”,两者都没有额外的代码。
    猜你喜欢
    • 2020-03-25
    • 2011-10-17
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2022-07-09
    • 2011-01-15
    • 1970-01-01
    相关资源
    最近更新 更多