在NodeJS中,如何读取C程序的输出?

时间:2019-06-23 21:57:01

标签: c node.js

在NodeJS中(使用Electron,因此console.log在窗口控制台上),我想生成一个C程序的子进程,并对其stdio进行读/写操作以进行通信。

这是Javascript:

const { spawn } = require('child_process');
var utfEncoder = new TextEncoder("utf-8");
var utfDecoder = new TextDecoder("utf-8");

var process =  spawn("./src/test-c");

process.stdout.on('data', (data) => {
  console.log(utfDecoder.decode(data));
});

model.send = function(s) {
  model.process.stdin.write(utfEncoder.encode(s));
}

console.log(model.process);

还有C:

int main() {
    char buffer[100];
    printf("ready !");
    fflush(stdout);
    for (int a = 0; a < 100; ++a) {
        scanf("%s", buffer);
        printf("I read: %s", buffer);
        fflush(stdout);
    }
    return 0;
}

“准备好了!”永远不会出现在任何地方。 但是当程序仅每秒打印一条消息时,它可以工作:

int main() {
    for (int a = 0; a < 10; ++a) {
        printf("ready !");
        fflush(stdout);
        sleep(1);
    }
    return 0;
}

通过此程序,消息“就绪!”在窗口控制台上每秒出现一次,但第一个没有发生(甚至scanf之前的第一条消息也没有)。

我在这里做什么错了?

编辑: 最初,我尝试使用bash脚本代替第二个示例(每秒回显一条消息),但实际上,它还可以与C程序一起使用,该程序每秒都编写一条消息,而无需读取任何输入(在此处编写)。

2 个答案:

答案 0 :(得分:0)

使用scanf("%s"...);时,您一直在阅读直到行尾。因此,您不会单独获得每个点。您可能只想读取一个字符。

答案 1 :(得分:0)

我解决了它,我的问题是我没有在单词的末尾添加空格字符到C程序中,例如:model.send("hey")而不是model.send(“ hey \ n”)`

因此scanf仍在等待单词结尾。 另外,如果邮件是用fflush(stdout)写的,而不是用printf写的,则write(STDOUT_FILENO, ...)是绝对必要的。