Запись в файл в WebAssembly - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть следующий фрагмент кода 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 для использования некоторых системных функций, таких как операторы, связанные с вводом / выводом.А может быть, не разрешено «манипулировать» файловой системой в этой среде браузера?Потому что в целом то, что происходит внутри браузера, должно оставаться внутри браузера.

Поэтому я пишу, чтобы узнать, как лучше перенести C-программу, связанную с файловым вводом-выводом, в среду WebAssembly.Любой комментарий будет оценен.Благодаря.

1 Ответ

0 голосов
/ 26 ноября 2018

d8 имеет функцию write ( v8 / src / d8.cc? L = 1706 ) для записи ввода / вывода, но Emscripten shell.js никогдаиспользует его для простых оболочек JS.Вам понадобится взломать код Emscripten, если вы хотите, чтобы он работал в простых оболочках JS.Попробуйте исследовать emscripten/src/library_fs.js.

РЕДАКТИРОВАТЬ: только что понял, что d8 write функция только печать на stdout, так что это не то, что вы хотите.Похоже, что запись в файл из простых оболочек JS невозможна (в любом случае, они предназначены только для разработчиков движка JS).

Я не проверял это, но думаю, что запись ввода / вывода, вероятно, сработаетполя при запуске тестового кода в Node.js.

Дополнительные вопросы:

Emscripten генерирует код оболочки JS путем предварительной обработки и объединения shell.js, preamble.js,postamble.js и некоторый код, сгенерированный во время компиляции из emscripten.py и compiler.js.Для предварительной обработки кода JS используется препроцессор в стиле C (#if, #else) плюс немного {{{ }}}, поэтому JS-код Emscripten выглядит очень забавно.

Многие функции C реализованы вC и JS вместе .C-часть этого напрямую связана с WebAssembly (см. Их реализацию здесь ), JS-часть этого реализована в library_*.js в здесь .

В настоящее времяChrome - единственный браузер, имеющий API веб-файловой системы .Google и Mozilla в настоящее время работают над стандартизацией Writable Files API .Первой реакцией большинства людей будет «это плохая идея», но поскольку браузеры уже позволяют выполнять ненадежный код в пользовательской системе (в «песочнице»), написание файлов, вероятно, не самая опасная вещь, которую может сделать браузер (https://twitter.com/ericlaw/status/1066149633855053825).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...