我有下面的C
代码,它挂在钩子上,要编译成WebAssembly
。
# include <stdio.h>
int main() {
FILE *f = fopen("file.txt", "w");
if (f == NULL)
{
printf("Error opening file!\n");
return 0;
}
/* print some text */
const char *text = "Write this to the file";
fprintf(f, "Some text: %s\n", text);
/* print integers and floats */
int i = 1;
float py = 3.1415927;
fprintf(f, "Integer: %d, float: %f\n", i, py);
char c = 'A';
fprintf(f, "A character: %c\n", c);
fclose(f);
return 0;
}
因此,我使用以下命令生成一个wasm
文件和相应的js
文件:
emcc write.c -s WASM=1 -o write.html
但是,当我试图使用JS引擎(如v8
)执行这段代码时,我根本找不到生成的输出。我也没有收到任何错误:
➜ test_code ~/v8/v8/out/x64.release/d8 write.js
➜ test_code
因此,根据我的理解,wasm
代码需要利用JS
来使用一些与系统相关的功能,比如I/O相关操作符。也许它不允许在这个浏览器环境中“操纵”文件系统?因为通常情况下,浏览器内部发生的事情应该停留在浏览器中。
因此,我写这封信是想了解将文件I/O相关的C程序迁移到WebAssembly
环境的最佳实践。如有任何意见,将不胜感激。谢谢。
发布于 2018-11-26 06:45:15
preamble.js
确实有一个用于I/O写的write
函数(v8/src/d8.cc?l=1706),但是Emscripten的shell.js
从未将它用于简单的JS。如果你想让它在简单的JS shell中工作,你需要对Emscripten的代码进行一些黑客攻击。尝试探索emscripten/src/library_fs.js
。
编辑:刚刚意识到d8的write
功能只有stdout
,所以这不是你想要的。看起来,从简单的JS shell编写文件是不可能的(它们只供JS引擎开发人员测试)。
我没有验证这一点,但我认为在Node.js中运行测试代码时,I/O写可能会开箱即用。
跟进问题:
Emscripten通过预处理和连接shell.js
、preamble.js
、postamble.js
以及在编译时从emscripten.py
和compiler.js
生成的一些代码来生成JS包装代码。JS代码的预处理使用C风格的预处理器(#if
,#else
)加上一些{{{ }}}
,这就是为什么Emscripten的JS代码看起来非常有趣的原因。
许多C函数是在C和JS中一起实现的。C-它的一部分直接链接到WebAssembly (请参阅它们的实现这里),JS-它的一部分是用library_*.js
在这里下实现的。
目前,Chrome是唯一拥有网络FileSystem API的浏览器。谷歌和Mozilla目前正致力于可写文件API的标准化。大多数人的第一个反应将是“这是个坏主意”,但由于浏览器已经允许在用户系统(沙箱中)执行不受信任的代码,编写文件可能不是浏览器可以做的最危险的事情(https://twitter.com/ericlaw/status/1066149633855053825)。
https://stackoverflow.com/questions/53480465
复制