与 emscripten 共享内存 ('sys/shm.h')

Posted

技术标签:

【中文标题】与 emscripten 共享内存 (\'sys/shm.h\')【英文标题】:Shared memory ('sys/shm.h') with emscripten与 emscripten 共享内存 ('sys/shm.h') 【发布时间】:2020-02-18 16:36:44 【问题描述】:

我一直在探索 emscripten,尝试编译一些使用 'sys/shm.h' 的基本 wasm 示例

这是我要编译的代码:

#include <stdio.h>
#include <sys/shm.h> 

int main(int argc, char *argv[]) 
    key_t key = ftok("shmfile",65); 
    int shmid = shmget(key,1024,0666|IPC_CREAT); 

    char *str = (char*) shmat(shmid,(void*)0,0); 
    sprintf(str, "balhhh");

    printf("Data in memory: %s\n",str); 

    shmdt(str); 
    return 0; 

这是我的编译输出:

➜  wasm emcc --version
emcc (Emscripten gcc/clang-like replacement) 1.39.8 (commit 1458145cf4f3db0fb548343e6acab267eef8e4ef)
Copyright (C) 2014 the Emscripten authors (see AUTHORS.txt)
This is free and open source software under the MIT license.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


➜  wasm emcc -o shared.html shared.c -s WASM=1 -s USE_PTHREADS=1                        
error: undefined symbol: ftok
warning: Link with `-s LLD_REPORT_UNDEFINED` to get more information on undefined symbols
warning: To disable errors for undefined symbols use `-s ERROR_ON_UNDEFINED_SYMBOLS=0`
error: undefined symbol: shmat
error: undefined symbol: shmdt
error: undefined symbol: shmget
Error: Aborting compilation due to previous errors
shared:ERROR: '/home/wave/Downloads/emsdk/node/12.9.1_64bit/bin/node /home/wave/Downloads/emsdk/upstream/emscripten/src/compiler.js /tmp/tmpiWE3Ei.txt' failed (1)


➜  wasm emcc -o shared.html shared.c -s WASM=1 -s USE_PTHREADS=1 -s LLD_REPORT_UNDEFINED
wasm-ld: error: /tmp/emscripten_temp_bNjvle/shared_0.o: undefined symbol: ftok
wasm-ld: error: /tmp/emscripten_temp_bNjvle/shared_0.o: undefined symbol: shmget
wasm-ld: error: /tmp/emscripten_temp_bNjvle/shared_0.o: undefined symbol: shmat
wasm-ld: error: /tmp/emscripten_temp_bNjvle/shared_0.o: undefined symbol: shmdt
wasm-ld: error: /home/wave/.emscripten_cache/wasm-obj/libc-mt.a(emscripten_pthread.c.o): undefined symbol: initPthreadsJS
shared:ERROR: '/home/wave/Downloads/emsdk/upstream/bin/wasm-ld -o /tmp/emscripten_temp_bNjvle/shared.wasm --lto-O0 /tmp/emscripten_temp_bNjvle/shared_0.o -L/home/wave/Downloads/emsdk/upstream/emscripten/system/local/lib -L/home/wave/Downloads/emsdk/upstream/emscripten/system/lib -L/home/wave/.emscripten_cache/wasm-obj /home/wave/.emscripten_cache/wasm-obj/libc-mt.a /home/wave/.emscripten_cache/wasm-obj/libcompiler_rt.a /home/wave/.emscripten_cache/wasm-obj/libc-wasm.a /home/wave/.emscripten_cache/wasm-obj/libdlmalloc-mt.a /home/wave/.emscripten_cache/wasm-obj/libpthread-mt.a /home/wave/.emscripten_cache/wasm-obj/libc_rt_wasm.a /home/wave/.emscripten_cache/wasm-obj/libsockets-mt.a --allow-undefined-file=/tmp/tmp5_bZ9l.undefined --import-memory --import-table --shared-memory -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr --strip-debug --export __wasm_call_ctors --export __data_end --export main --export __errno_location --export emscripten_get_global_libc --export __pthread_tsd_run_dtors --export __emscripten_pthread_data_constructor -z stack-size=5242880 --initial-memory=16777216 --no-entry --max-memory=16777216 --global-base=1024' failed (1)

我猜想在 emscripten 中有共享内存支持,但我就是无法让 wasm-ld 正确链接它。 有人可以帮忙吗?

谢谢, 加尔

【问题讨论】:

为什么你认为 Emscripten 支持共享内存?显然,WebAssembly 代码不允许使用共享内存。我猜 Emscripten 可能拥有实际上并未共享的“假”共享内存,但为什么会这样呢? 当在 WebAssembly 中实现多内存时,可以精细控制共享内存。目前只能共享所有内存。 【参考方案1】:

Emscripten 不支持 SysV 共享内存(sys/shm.h 中的函数)。

【讨论】:

今天不是这样。 Emscripten 现在支持 Pthread。 @tigercosmos 是否也支持 SysV 共享内存? 对不起!我误解了这两件事。

以上是关于与 emscripten 共享内存 ('sys/shm.h')的主要内容,如果未能解决你的问题,请参考以下文章

将 emscripten 与 opengl 着色器一起使用

Emscripten教程之代码可移植性与限制

Emscripten教程之代码可移植性与限制

Emscripten:提供下载/保存生成的 MEMFS 文件

Emscripten 中的“Module”变量机制,同时将 Pthread 编译为 worker

将 QT WebAssembly 与 Emscripten 关联