首页 > 解决方案 > 在 NodeJS 中,如何读取 C 程序的输出?

问题描述

在 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 程序,该程序每秒写入一条消息而不读取任何输入(写在这里)。

标签: cnode.js

解决方案


我解决了,我的问题是我没有在单词末尾包含空格字符,就像这样:model.send("hey")而不是 model.send("hey\n")`

因此,scanf仍在等待单词的结尾继续进行。此外,如果消息是用 写的,但不是用写的,fflush(stdout)则绝对必要。printfwrite(STDOUT_FILENO, ...)


推荐阅读