如何从NaCl Dev Environment应用程序打开文件?

时间:2015-05-05 00:59:08

标签: c google-chrome file-io google-nativeclient

我试图在NaCl Development Environment中运行一个简单的命令行应用程序。但我不明白为什么它不想打开文件:

#include <stdio.h>
#include <ppapi_simple/ps_main.h>
int my_main (int argc, char ** argv) {
  FILE * f = fopen ("out.txt","w");
  if (f) {
    fputs ("output to the file", f);
    fclose(f);
  } else {
    puts("could not open file");
  }
}
PPAPI_SIMPLE_REGISTER_MAIN(my_main)

运行:

bash.nmf-4.3$ gcc -I"$NACL_SDK_ROOT/include" test.c -lppapi_simple -lnacl_io -lppapi
bash.nmf-4.3$ ./a.out 
could not open file
bash.nmf-4.3$

应用程序显然可以在开发环境中的任意位置打开文件 - 我使用nano编辑测试代码!但是纳米doesn't look like it's been changed的naclports版本会立即连接到文件操作..?

Lua是appears to have only been modified very slightly的另一款应用。它介于两者之间,因为它可以运行测试文件,但前提是它们放在/mnt/html5中,并且不会从主文件夹加载它们。如果我将其更改为/mnt/html5,那么我的测试程序在行为上没有显示出差异。

NB。我的目标是构建一个终端应用程序,我可以在开发环境中使用Lua和nano等,而不是基于浏览器的应用程序 - 我认为这对文件处理规则有所不同。

2 个答案:

答案 0 :(得分:2)

在NaCl Dev Environment中运行的程序当前需要与-lcli_main(后者依赖于-lnacl_spawn)链接,以获得了解如何与{{{}中的javascript“内核”进行通信的入口点1}}。他们需要知道它们运行的​​当前工作目录,以及有关已安装文件系统的信息。

可以运行仅针对ppapi_simple链接的程序,但不会设置开发环境可能期望的所有挂载点。

dev env中有一个链接描述文件,可以简化命令行程序naclprocess.js的链接。例如,问题中的测试程序可以编译为:

-lmingn

注意:此链接描述文件有一个最近解决的问题,修复程序的新版本已于2015年5月5日发布到商店。

在不久的将来,我们计划通过允许gcc test.c -o test -lmingn成为切入点来进一步简化事情。

感谢您指出lua端口缺少新的切入点! 我已经提交了一个问题,并将尽快修复它: https://code.google.com/p/naclports/issues/detail?id=215

答案 1 :(得分:0)

我找到了解决方案,但我并不完全明白它在做什么。事实证明,纳米的微小变化非常重要,因为它们会导致NaCl库中其他地方的其他功能被正确设置环境以进行文件处理。

如果上述文件更改为:

#include <stdio.h>
int nacl_main (int argc, char ** argv) {
  FILE * f = fopen ("out.txt","w");
  if (f) {
    fputs ("output to the file", f);
    fclose(f);
  } else {
    puts("could not open file");
  }
}

...并使用另外两个库进行编译:

gcc -I"$NACL_SDK_ROOT/include" test.c -lppapi_simple -lnacl_io -lppapi -lcli_main -lnacl_spawn

...然后它将按预期工作并写入文件。

不是使用main注册我们自己的非PPAPI_SIMPLE_REGISTER_MAIN函数,而是引入cli_main会导致它使用内部函数来设置某些内容,可能包括需要的内容使文件写入工作,然后期望能够调用nacl_main,这是留给程序定义的外部可见性(几层虚假 - main堆叠正在进行中)。这就是纳米变化如此微小的原因。

nacl_spawn需要关联,因为cli_main将其用于......某事。