我现在正在学习WebAssembly,发现外部函数(libc 或第三方函数)无法被 Wasm 世界轻松访问(使用 import 是通用解决方案)。
我试图用emcc编译我的源代码到WASM但malloc并free广泛应用于我的源代码。我认为从现实世界中导入malloc和导入free是不可行的。
所以,我很好奇如何malloc在 wasm 世界中实现。我已经知道 malloc 是如何工作的glibc:使用 brk() 或 sbrk() 来扩展堆和线性地址的一些内存管理。但在 wasm 世界中,我认为不可能打电话brk()或sbrk()获得班轮地址。
malloc像这样使用全局变量来实现是否合理?
u_char mem[10240];
void *wasm_malloc(size_t num)
{
/*get the free mem idx*/
return &mem[idx];
}
Run Code Online (Sandbox Code Playgroud) 一个简单的 C 代码文件如下所示:
fd = socket(...)
set_reuseaddr(...)
bind(fd, 6666,...)
Run Code Online (Sandbox Code Playgroud)
该代码可以由一台机器(Linux)中的两个单独的进程运行。但是当我添加listen()这样的代码时:
fd = socket(...)
set_reuseaddr(...)
bind(fd, 6666,...)
listen(fd)
Run Code Online (Sandbox Code Playgroud)
第二个进程调用bind()失败。
首先,我还没有发现两个单独的进程bind()仅使用同一端口而不调用listen()。
所以我很困惑,为什么当一个进程尝试绑定现有端口时,实现不能只返回失败,以及为什么它会延迟到listen()?