Как я могу вызвать exec
в WASM? Когда я пробую пример ниже, он выдает ошибку 45 (Operation not supported
). Есть ли какой-то флаг для включения exec
? callee.wasm
не тот файл для exec
?
Терминал:
> emcc callee.c -o callee.wasm
> emcc caller.c --embed-file callee.wasm -o index.html
> # will be used through index.html, but node is faster for development
> # note: MEMFS working directory is "/" and "/callee.wasm" exists
> # https://emscripten.org/docs/api_reference/Filesystem-API.html
> node index.js
Caller
Caller: 45
caller.c
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
int main() {
printf("Caller\n");
char *args[] = {"./callee.wasm", NULL};
execvp(args[0], args);
printf("Caller: %d\n", errno);
}
callee.c
#include <stdio.h>
int main() {
printf("Success!\n");
}
Следует уточнить, что это упрощенная версия, поэтому не предлагайте ставить printf("Success!\n");
в caller.c
и полностью избегать exec
.
Кажется, вы не можете, если не считать повторной реализации exec
себя.
Сначала порядковый номер: errno
45 не EOPNOTSUPP
под Emscripten, как следует из вопроса; на самом деле это ENOEXEC
(см. arch/emscripten/bits/errno.h и wasi/api.h). errno
числа, как правило, не совпадают между платформами, и нет никаких причин, по которым errno
числа в BSD libc согласуются с Emscripten libc.
И жёсткие коды Emscripten libc всегда терпят неудачу с ENOEXEC , и всё exec*
семейство вызовов libc в конечном итоге оказывается там, включая execvp. Однако символ объявлен слабым, поэтому в принципе вы можете заменить реализацию по умолчанию своей собственной. Как вы собираетесь этого добиться, я оставляю на ваше усмотрение.