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



在nodejs中(使用电子,so 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程序一起使用,该程序在不阅读任何输入的情况下写下消息Evvery(此处写(。

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

我解决了它,我的问题是我在单词末尾没有将太空字符包含在c程序中,例如: model.send("hey")而不是model。n"(`

因此,scanf仍在等待单词的结尾进行。另外,如果消息是用printf编写的,则fflush(stdout)是必不可少的,但不使用write(STDOUT_FILENO, ...)

最新更新