【问题标题】:Extracting the outputs/results from an executed .pexe file从执行的 .pexe 文件中提取输出/结果
【发布时间】:2016-09-06 11:34:15
【问题描述】:

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

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

任何建议将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    根据我的尝试,您似乎无法捕获 pexe 写入标准输出的内容 - 它只是进入浏览器的标准输出(我花了几个小时才意识到它确实去了某个地方 - 我跟着一个糟糕的教程让我相信 pexes 标准输出将被发布到 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 派生一个类并让

    在 html/js 方面,您可以拥有一个 textarea 和一个 pre(我喜欢称之为 stdin 和 stdout ;-))和一个将 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 的包含目录并忽略有关“注册”存储位置说明符:-)

    【讨论】:

      【解决方案2】:

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

      1. 我建议使用 nacl_io 在浏览器中模拟 POSIX(另请参阅 file_io。这将允许您以任何您喜欢的格式在本地保存文件、检索它们。

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

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

      【讨论】:

      • 是的,我在 chrome 浏览器中使用 .pexe。谢谢你的建议,我会全部检查出来的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 2010-12-14
      相关资源
      最近更新 更多