从已执行的 .pexe 文件中提取 outputs/results

Extracting the outputs/results from an executed .pexe file

我的目标是将 C++ 程序转换为 .pexe 文件,以便稍后在远程计算机上执行它。 .pexe 文件将包含一些要在远程计算机上计算的数学公式或函数,因此我将基本上使用远程计算机的计算能力。对于所有这些,我将使用 nacl_sdk 和 Pepper 库,如果有人能为我澄清一些事情,我将不胜感激:

  1. 是否可以将远程计算机上执行的 .pexe 文件的输出保存到一个文件中,如果可以,那么怎么做?支持哪些文件格式?
  2. 是否可以将远程计算机上执行的 .pexe 文件的输出自动发送到主机,如果可以的话如何?
  3. 我是否必须安装任何东西才能在远程计算机上运行?

如有任何建议,我们将不胜感激。

您是否在浏览器中使用 .pexe?这是通常的情况。

  1. 我推荐使用nacl_io to emulate POSIX in the browser (also look at file_io。这将允许您以您喜欢的任何格式在本地保存和检索文件。

  2. 要发送输出,请使用浏览器的常用功能,例如 XMLHttpRequest. You need PNaCl to talk to JavaScript for this, you may want to look at some of the examples

  3. 一个普通的网络服务器就可以了,这真的取决于你在做什么。

根据我的尝试,您似乎无法捕获 pexe 写入标准输出的内容 - 它只是转到浏览器的标准输出(我花了几个小时才意识到它确实去了某个地方 -我遵循了一个糟糕的教程,该教程让我相信 pexes stdout 将 posted 到 javascript 一侧,并且想知道为什么它 "did nothing").

我目前也在努力将我的东西移植到 .pexe,结果证明这很简单,但这与我编写程序的方式有关:

我编写我的 (C++) 程序,使得所有 code-parts 仅从 std::istream 对象读取输入并将它们的输出写入某个 std::ostream 对象。然后我只需将 std::cinstd::cout 传递给 top-level 调用,就可以在 shell 中交互式地使用该程序。但是然后我可以轻松地换掉 top-level 调用以使用 std::ifstreamstd::ofstream 来使用 batch-processing 的程序(没有来自 cat 的管道并重定向到文件,这在某些情况下可能会很麻烦)。

因为我是这样写程序的,所以我可以像这样实现消息处理程序

class foo : public pp::Instance {
   ... ctor, dtor,...
   virtual void HandleMessage(const pp::Var& msg) override {
       std::stringstream i, o;
       i << msg.AsString();
       toplevelCall(i,o);
       PostMessage(o.str());
   }
};

所以我从浏览器获得的数据被放入一个字符串流中,其余代码可用于输入。它获得另一个字符串流,其余代码可以将其输出写入其中。然后我将该输出发送回浏览器。 (缺点是您必须等待程序完成才能看到结果 - 您可以从 ostream 派生 class 并将 << 运算符 post 直接发送到浏览器...... nacl应该带有一个 class 来做到这一点 - 我不知道它是否真的......)

在 html/js 方面,您可以有一个 textarea 和一个 pre (我喜欢称其为 stdin 和 stdout ;-) )和一个按钮 posts textarea 的内容到 pexe - 并且有一个事件处理程序将消息从 pexe 写入 pre 像这样

<embed id='pnacl' type='application/x-pnacl' src='manifest.nmf' width='0' height='0'/>
<textarea id="stdin">Type your input here...</textarea>
<pre id='stdout' width='80' height='25'></pre>

<script>
  var pnacl = document.getElementById('pnacl');
  var stdout = document.getElementById('stdout');
  var stdin = document.getElementById('stdin');
  pnacl.addEventListener('message', function(ev){stdout.textContent += ev.data;});
</script>
<button onclick="pnacl.postMessage(stdin.value);">Submit</button>

恭喜!您的程序现在可以在浏览器中运行了!

我的编译器移植还没有完成,但似乎这甚至适用于使用 flex 和 bison 的东西(你只需要将 FlexLexer.h 复制到 pnacl sdk 的包含目录并忽略关于 "register" 存储位置说明符的警告:-)