我有下面一段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: %sn", text);
/* print integers and floats */
int i = 1;
float py = 3.1415927;
fprintf(f, "Integer: %d, float: %fn", i, py);
char c = 'A';
fprintf(f, "A character: %cn", 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
环境中的最佳实践。如有任何意见,我们将不胜感激。谢谢
d8
确实有一个用于I/O写入的write
函数(v8/src/d8.cc?l=1706(,但Emscripten的shell.js
从未将其用于简单的JS shell。如果你想让Emscripten的代码在简单的JS shell中工作,你需要对它进行一些黑客攻击。尝试探索emscripten/src/library_fs.js
。
编辑:刚刚意识到d8的write
函数只打印到stdout
,所以这不是你想要的。看起来从简单的JS外壳写入文件是不可能的(无论如何,它们只供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是唯一一个拥有WebFileSystemneneneba API的浏览器。Google和Mozilla目前正致力于将可写文件API标准化。大多数人的第一反应是"这是个坏主意",但由于浏览器已经允许在用户系统中(在沙盒中(执行不受信任的代码,因此编写文件可能不是浏览器能做的最危险的事情(https://twitter.com/ericlaw/status/1066149633855053825)。