如何从nodeJS调用C函数

时间:2017-07-23 14:26:18

标签: c node.js

我有一些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)

有人可以帮忙解释一下吗?感谢。

2 个答案:

答案 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)