在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, ...)
。