Запись в файл в 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: %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 ответ

Решение

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-интерфейс Web FileSystem. Google и Mozilla в настоящее время работают над стандартизацией API Writable Files. Первой реакцией большинства людей будет "это плохая идея", но поскольку браузеры уже позволяют выполнять ненадежный код в пользовательской системе (в песочнице), написание файлов, вероятно, не самая опасная вещь, которую может сделать браузер ( https://twitter.com/ericlaw/status/1066149633855053825).

Другие вопросы по тегам