问题描述
如果你们必须知道我实际上在做什么,那就是它:https://github.com/Meigyoku-Thmn/CSBinary(。NET Core的BinaryReader和BinaryWriter的端口)。
问题是,我的库没有File Buffering(请再次从我的另一篇文章中了解,这与NodeJS中的Buffer类无关),我想利用I / C运行时的O系统,而不必编写BufferedFile类(以.NET中的BufferedStream类为例)。
在C语言中,如果您打开/创建文件(fopen)并获得一个FILE * 实例,那么它正在执行文件缓冲在后台,甚至可以使用setvbuf函数来设置文件缓冲区的大小(同样,与Buffer类无关)。
我想如果我手头有一个文件描述符(由fs模块创建),则可以使用fdopen函数将其包装/关联到FILE *实例中,并获得内置的C免费的运行时文件缓冲。
不幸的是,NodeJS似乎是使用静态链接构建的。所以我的插件使用了与NodeJS分开的C运行时。从NodeJS创建的文件描述符不能直接在我的插件中使用,并且libuv与fdopen没有任何相似之处。
根据NodeJS文档中的this section,在某些情况下,node-gyp将“下载完整的源tarball”,并让我“ 具有对Node.js依赖项的完整访问的完全权限”。可能是这样,但是除了指定nodedir标志(这需要我手动准备“本地Node.js源图像”)之外,文档还很模糊。
这是死胡同,任何有经验的人,请帮助我。
解决方法
最终,我找到了一种方法:
int nodejs_fd = gotFromJs();
// on POSIX-system,fd is process-wide,so I don't have to do anything
int fd = nodejs_fd;
// but on Windows,fd is just simulated on top of OS-Handle
// so it's bound to a specific C runtime,and my addon use a separate C runtime.
// therefore,I cannot just pass it to fdopen (EBADF)
// but I can still get the OS-handle
#ifdef _WIN32
HANDLE fh = (HANDLE)uv_get_osfhandle(nodejs_fd);
// so I can just open my own fd that points to it,side-by-side with the fd of NodeJS
fd = _open_osfhandle((intptr_t)fh,_O_RDONLY);
#endif
// and problem solved
FILE* file = fdopen(fd,"rb");