gpt4 book ai didi

javascript - 在 WebAssembly 中写入文件

转载 作者:行者123 更新时间:2023-11-30 20:00:02 25 4
gpt4 key购买 nike

我有以下一段 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 环境的最佳实践。任何评论将不胜感激。谢谢。

最佳答案

d8 确实有一个用于 I/O 写入的 write 函数 ( v8/src/d8.cc?l=1706 ),但是 Emscripten 的 shell.js从不将它用于简单的 JS shell。如果你想让它在简单的 JS shell 中工作,你需要对 Emscripten 的代码进行一些修改。尝试探索 emscripten/src/library_fs.js .

编辑:刚刚意识到 d8 的 write 功能只有 print to stdout ,所以这不是你想要的。看起来从简单的 JS shell 写入文件是不可能的(它们只是供 JS 引擎开发人员测试的东西)。

我没有验证这一点,但我认为在 Node.js 中运行测试代码时,I/O 写入可能会开箱即用。

后续问题:

Emscripten通过预处理和拼接shell.jspreamble.jspostamble.js和一些代码来生成JS封装代码在编译时从 emscripten.py 生成和 compiler.js . JS代码的预处理使用了C风格的预处理器(#if#else)加上一些{{{ }}},这这就是为什么 Emscripten 的 JS 代码看起来很有趣。

许多 C 函数是用 C 和 JS 一起实现的。它的 C 部分直接链接到 WebAssembly(参见它们的实现 here ),它的 JS 部分在 here 下的 library_*.js 中实现。 .

目前,Chrome 是唯一拥有 Web FileSystem API 的浏览器. Google 和 Mozilla 目前正在致力于标准化 Writable Files API .大多数人的第一 react 是“这是个坏主意”,但由于浏览器已经允许在用户系统(在沙箱中)中执行不受信任的代码,写入文件可能不是浏览器可以做的最危险的事情(https://twitter.com/ericlaw/status/1066149633855053825) .

关于javascript - 在 WebAssembly 中写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53480465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com