代码之家  ›  专栏  ›  技术社区  ›  lllllllllllll

写入WebAssembly中的文件

  •  1
  • lllllllllllll  · 技术社区  · 6 年前

    我有以下几件 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 
    

    所以根据我的理解, 瓦斯姆 代码需要利用 JS 使用一些与系统相关的功能,如与I/O相关的运算符。也许不允许在这个浏览器环境中“操作”文件系统?因为一般来说,在浏览器中发生的事情,应该留在浏览器中。

    因此,我写这封信是为了询问将与文件I/O相关的C程序迁移到 包袱 环境。任何评论将不胜感激。谢谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   John London    6 年前

    d8 有一个 write 功能( v8/src/d8.cc?l=1706 )用于I/O写入,但Emscripten的 shell.js 不要将它用于简单的JS shell。如果您希望emscripten的代码在简单的JS shell中工作,那么需要对它进行一些黑客攻击。尝试探索 emscripten/src/library_fs.js .

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

    我没有验证这一点,但我认为在node.js中运行测试代码时,I/O写入可能会不合时宜。

    后续问题:

    emscripten通过预处理和连接生成JS包装代码 壳牌JS ,请 preamble.js , postamble.js 编译时生成的一些代码 emscripten.py compiler.js . JS代码的预处理使用C型预处理器( #if , #else )加上一些 {{{ }}} 这就是为什么Emscripten的JS代码看起来很有趣。

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

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

    推荐文章