如何从 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
我正在尝试在 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