从执行的.pexe文件中提取输出/结果

时间:2016-05-11 07:52:35

标签: google-chrome google-chrome-devtools google-nativeclient ppapi

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

  1. 是否可以将远程计算机上执行的.pexe文件的输出保存到文件中,如果可能的话怎么办?支持哪些文件格式?
  2. 是否可以将远程计算机上执行的.pexe文件的输出自动发送到主机,如果有可能的话怎么办?
  3. 我是否必须安装任何可以在远程计算机上运行的东西?
  4. 任何建议都将受到赞赏。

2 个答案:

答案 0 :(得分:0)

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

  1. 我建议使用nacl_io在浏览器中模拟POSIX(同时查看file_io。这样您就可以在本地保存文件,以您想要的任何格式检索它们。

  2. 要发送输出,请使用浏览器的常用功能,例如XMLHttpRequest。您需要PNaCl与JavaScript交谈,您可能需要查看some of the examples

  3. 普通的网络服务器会做,这实际上取决于你正在做什么。

答案 1 :(得分:0)

从我尝试的内容来看,似乎你无法捕捉到你的pexe写给stdout的东西 - 它只是去浏览器的标准(它花了我几个小时才意识到它确实发生了在某个地方 - 我遵循了一个糟糕的教程让我相信pexes stdout将被发布到javascript端并且想知道为什么它"什么都不做")。

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

我编写了我的(C ++)程序,使得所有代码部分仅从std::istream对象读取输入,并将其输出写入某个std::ostream对象。然后我将std::cinstd::cout传递给顶级调用,并可以在shell中以交互方式使用该程序。但是我可以轻松地交换顶级调用以使用std::ifstreamstd::ofstream来使用该程序进行批处理(没有来自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派生一个类并直接将&lt;&lt;操作符发布到浏览器... nacl应该附带一个类这样做 - 我不知道它是否真的......)

在html / js方面,你可以有一个textarea和一个pre(我喜欢称之为stdin和stdout ;-))和一个发布textarea内容的按钮到pexe - 并有一个eventhandler将来自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&amp; amp; bison(你只需要将FlexLexer.h复制到pnacl sdk的include目录中,并忽略关于&#34; register&#34;存储位置说明符的警告: - )