c - 在 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 程序,该程序每秒写入一条消息而不读取任何输入(写在这里)。
解决方案
我解决了,我的问题是我没有在单词末尾包含空格字符,就像这样:model.send("hey")
而不是 model.send("hey\n")`
因此,scanf
仍在等待单词的结尾继续进行。此外,如果消息是用 写的,但不是用写的,fflush(stdout)
则绝对必要。printf
write(STDOUT_FILENO, ...)
推荐阅读
- python-3.x - 我的代码不能正常工作,但我不确定问题出在哪里
- ios - IOS - 应用程序未运行时如何处理通知
- sequelize.js - 嵌套和续集
- macos - Visual Studio MacOS 上的 Web Essentials
- node.js - 如何通过单个角度应用程序在每个子域级别动态添加脚本标签?
- neo4j - 调用过程 `apoc.load.csv` 失败:原因:java.io.IOException:无法打开文件 test.csv 进行读取
- c# - 在 ASP.NET MVC 中使用 SqlQuery
- c# - Cognos v11 SDK 导出为 pdf
- python - pd.read_csv 解析不正确
- ruby-on-rails - 资产中的 Rails 5.2 字体文件夹引发 404(未找到)错误