如何从 NaCl 开发环境应用程序打开文件?

How to open files from a NaCl Dev Environment application?

我正在尝试在 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 编辑测试代码!但是 nano doesn't look like it's been changed 的 naclports 版本直接连接到文件操作..?

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

注意。我的目标是构建一个终端应用程序,我可以在开发环境中与 Lua 和 nano 等一起使用,而不是基于浏览器的应用程序 - 我认为这会对文件处理规则产生一些影响。

我找到了解决这个问题的办法,虽然我不完全明白它在做什么。事实证明,对 nano 所做的小改动 很重要,因为它们会导致 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

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

不是用 PPAPI_SIMPLE_REGISTER_MAIN 注册我们自己的 not-main 函数,而是引入 cli_main 导致它使用一个内部函数来设置一些东西,大概包括什么是文件写入工作所必需的,并且期望能够调用 nacl_main,这是留给程序定义的外部可见性(几层假 main 堆叠正在进行)。这就是为什么 nano 的变化看起来如此之小。

nacl_spawn 需要链接,因为 cli_main 将其用于...某事。

NaCl Dev Environment 中的程序 运行 目前需要与 -lcli_main(这又取决于 -lnacl_spawn)链接以获得一个入口点,该入口点了解如何与 javascript "kernel" 在 naclprocess.js。他们需要这个来知道他们 运行 来自哪个当前工作目录,以及了解已安装的文件系统。

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

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

gcc test.c -o test -lmingn

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

在不久的将来,我们计划通过允许 main 作为入口点来进一步简化事情。

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