我有一些C函数需要经常从nodeJS调用(少于1秒的时间间隔)。 C函数接受一个参数并返回一个值,该值可能是int或数组。
可以简单如下:
int main() {
int x = 2;
return x;
}
我需要在nodeJS中获取值x并且能够执行console.log(x)
我尝试使用node-ffi
,但我从互联网上读到它有很大的开销,因此频繁的函数调用效率很低。
我还考虑过编写插件,但它看起来很麻烦(使用不熟悉的V8,C ++代码以及所有......)
关于nodeJS和C之间的集成没有太多资源(它们主要是带有C ++的nodeJS)
有人可以帮忙解释一下吗?感谢。
答案 0 :(得分:0)
将您的C代码更改为
// myProgram.c
#include <stdio.h>
int main(void){
puts("4");
return 0;
}
使用gcc在与您的节点文件相同的目录中进行编译
$ gcc -o myProgram myProgram.c
在您的节点文件中,要求exec()
const { exec } = require("child_process");
并像这样使用它:
exec("./myProgram", (error, stdout, stderr) => console.log(stdout));
这很好,每次都会启动一个新进程。
另一方面,如果您想保持子进程运行,并从节点中调用该代码中的函数,则可以这样做:
// multiplyBy2.c
#include <stdio.h>
#include <stdlib.h>
int timesTwo(int x){
return x*2;
}
int main(void){
char buff[100];
int input,output;
while(1){
gets(buff);
input = atoi(buff);
output = timesTwo(input);
printf("%d", output);
// you must flush stdout or else node will hang!
fflush(stdout);
}
return 0;
}
编译multipleBy2.c,然后:
// myNodeApp.js
const {spawn} = require('child_process');
const __delay__ = t => new Promise(resolve=>setTimeout(()=>resolve(), t))
const ch = spawn('./multiplyBy2')
var result=undefined;
ch.stdout.on("data",(data)=>{
result = parseInt(data.toString())
})
async function multiplyBy2InC(num){
ch.stdin.write(`${num}\n`)
while(result==undefined)
await __delay__(1)
const output = result
result = undefined
return output
}
// now you could call it like this, it will print 20 to the console
multiplyBy2InC(10).then(r=>console.log(r))
答案 1 :(得分:-1)