如何在另一个C++程序中运行C++程序?

8

我将概述我希望实现的场景。

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

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

有谁知道如何在C++中实现这一点?最好是父程序和子程序都是用C++编写的。

在父应用程序中加载子应用程序的性能并不重要。唯一重要的是子父之间调用函数时的通信性能。


8
fork()exec()函数系列可以帮助你。 - Grijesh Chauhan
1
@monad-newb 是的,它们是预编译的。 - Jeroen
1
@dmh 用户应该能够在运行时添加和删除子应用程序。 - Jeroen
2
没有标准的C++方法来做到这一点,答案必须是特定于操作系统的。请指定您要针对哪些操作系统。 - Andrew Tomazos
2
听起来你想要一种虚拟机,否则可靠的沙盒化预编译二进制应用程序可能会很困难。但最好的方法可能是让子进程使用脚本语言,这样他们只能做父进程为他们做的事情。 - hyde
显示剩余10条评论
4个回答

3
您需要编写自己的编译器。
考虑到:没有正常的操作系统支持您想要的。您希望两个可执行文件在单个进程内运行,但该进程可能会根据进程内的某些怪异情况进行或不进行操作系统调用,而这些情况操作系统根本无法理解。
使用自定义编译器就可以解决这个问题,因为它不会创建有问题的指令。这类似于Java和.NET,它们也防止在它们控制之外进行此类操作系统调用。

子进程无法访问操作系统。它们不必是可执行文件。它们可以是独立的进程,但这是否意味着您无法对它们进行任何控制? - Jeroen
2
它们不能是独立的进程。微不足道的是:您无法跨进程边界调用函数。 - MSalters
1
除非你把RPC机制视为函数调用(如果你的措辞够宽泛的话),否则不算函数调用。 - Jeremy Friesner

2

一种可移植的解决方案:Google Native Client

一种可能的Linux解决方案:

  1. 使用“hats”创建AppArmor配置文件(“hat”是应用程序可以使用libapparmor以编程方式切换的沙盒配置),
  2. 让主应用程序创建一个“pipe”,
  3. 让主应用程序“fork”,
  4. 切换到与子应用程序相对应的“hat”,
  5. 执行子应用程序,
  6. 主应用程序和子应用程序通过之前创建的“pipe”进行通信。

据我理解,这并不会阻止子进程与操作系统进行交互,这一点非常关键。 - Jeroen
Binero,具有“安全环境”和“防止孩子与操作系统互动”不是一回事。后者在大多数情况下几乎没有实际价值。 - ArtemGr

0
如果您希望使用(半)跨平台的方法来实现此操作,可以使用RPC调用另一个进程中的函数。它适用于支持分布式计算环境的任何内容。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

-1

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


在这种方式中使用 system 会在代码中造成非常严重的漏洞,特别是如果运行它的人可以创建自己的 PerlScript.pl 文件并将其替换。此外,它不支持两个进程“随时调用彼此的函数”,除非在两者中都加入额外的代码。 - Nick Reed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接