#node.js #c #crt #node.js-addon
#node.js #c #crt #node.js-addon
Вопрос:
Если вам, ребята, нужно знать, что я на самом деле делаю, то это оно:https://github.com/Meigyoku-Thmn/CSBinary (Порт BinaryReader и BinaryWriter из .NET Core).
Дело в том, что в моей библиотеке нет буферизации файлов (пожалуйста, повторите из моего другого поста, это не имеет ничего общего с классом Buffer в NodeJS), и я хочу воспользоваться системой ввода-вывода среды выполнения C, вместо того, чтобы писать класс BufferedFile (подумайте о классе BufferedStream в .NET).
На языке C, если вы открываете / создаете файл (fopen) и получаете экземпляр FILE*, то он выполняет буферизацию файла за сценой, вы даже можете установить размер буфера файла (опять же, ничего общего с классом Buffer) с помощью функции setvbuf.
И я думаю, что если бы у меня был дескриптор файла (созданный модулем fs), я мог бы использовать функцию fdopen, чтобы обернуть его / связать в экземпляре FILE * и получить встроенную буферизацию файлов среды выполнения C бесплатно.
К сожалению, NodeJS, похоже, создается с использованием статической ссылки. Итак, мой аддон использует отдельную среду выполнения C от той, которую использует NodeJS. Файловый дескриптор, созданный из NodeJS, не может быть использован непосредственно в моем аддоне, а в libuv нет ничего похожего на fdopen.
Согласно этому разделу в документах NodeJS, есть случай, когда node-gyp «загрузит архив с полным исходным кодом» и предоставит мне «полный доступ к полному набору Node.js зависимости«. Это может быть так, но помимо указания флага nodedir (который требует, чтобы я вручную подготовил «локальный Node.js исходное изображение»), документы довольно расплывчаты.
Итак, это тупик, у кого-нибудь есть опыт в этом, пожалуйста, помогите мне.
Комментарии:
1. Я удалил тег C .
Ответ №1:
В конце концов, я нашел способ сделать это:
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");