我的目标是创建一个简单的插件,打开一个内存映射文件,并为缓冲区提供节点原始访问。内存映射文件已经存在,因此我不需要创建新文件 - 如果文件尚未创建(由另一个进程),则会抛出错误。
这是我到目前为止所做的:
#include <nan.h>
#include <windows.h>
using namespace v8;
void get_shm(const Nan::FunctionCallbackInfo <v8::Value> &info) {
if (info.Length() != 1) {
return Nan::ThrowTypeError("Wrong number of arguments. You must specify size of mapped file!");
}
if (!info[0]->IsNumber()) {
return Nan::ThrowTypeError("Bad argument. Size of mapped file must be a number!");
}
int len = info[0]->Uint32Value();
HANDLE h = OpenFileMappingA(FILE_MAP_WRITE | FILE_MAP_READ, 1, "Global\\_GB_SharedMemory_Read");
if (h == NULL) {
Nan::ThrowTypeError("Couldn't open memory mapped file");
}
char *buf = (char *) MapViewOfFile(h, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, len);
Nan::MaybeLocal<Object> jsbuf = Nan::NewBuffer(buf, len);
info.GetReturnValue().Set(jsbuf.ToLocalChecked());
}
void Init(v8::Local <v8::Object> exports) {
exports->Set(Nan::New("get_shm").ToLocalChecked(),
Nan::New<v8::FunctionTemplate>(get_shm)->GetFunction());
}
NODE_MODULE(addon_shm, Init)
不幸的是,在返回NewBuffer之后的某个时刻节点崩溃(可能是由于访问冲突)。它不会立即崩溃,但会在一些不可预测的时间后崩溃。
我没有尝试在Javascript中从缓冲区读取/写入。使用add的唯一一行是:
const buf=shm.get_shm(10);
其他进程创建的映射文件大于10。
如果我使用malloc创建缓冲区,则不会出现问题。
如果我只调用get_shm(10)而不存储结果,则不会出现问题。
努力理解这个问题......