在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程序一起使用,该程序每秒都编写一条消息,而无需读取任何输入(在此处编写)。>
答案 0 :(得分:0)
使用scanf("%s"...);
时,您一直在阅读直到行尾。因此,您不会单独获得每个点。您可能只想读取一个字符。
答案 1 :(得分:0)
我解决了它,我的问题是我没有在单词的末尾添加空格字符到C程序中,例如:model.send("hey")
而不是model.send(“ hey \ n”)`
因此scanf
仍在等待单词结尾。
另外,如果邮件是用fflush(stdout)
写的,而不是用printf
写的,则write(STDOUT_FILENO, ...)
是绝对必要的。