写入WebAssembly中的文件



我有下面一段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.jspreamble.jspostamble.js以及在编译时从emscripten.pycompiler.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)。

相关内容

  • 没有找到相关文章

最新更新