我正在尝试创建一个非常简单的nodejs服务器来接收post请求并将它们提供给一个简单的C程序,该程序通过stdin和stdout生成所有I / O.我正在尝试使用以下脚本作为测试:
var prc = require('child_process').spawn('./example');
// )none of these made it work)
prc.stdout.setEncoding('ascii');
//prc.stdout.setEncoding('utf8');
prc.stdout.on('data', function (data) {
console.log("child said something: " + data);
});
prc.stderr.on('data', function (data) {
console.log("stderr: " + data.toString());
});
prc.on('close', function (code) {
console.log('process exit code ' + code);
});
setInterval(function() {
console.log("gonna write");
prc.stdin.write("prueba inicial\n");
console.log("wrote");
}, 2000);
example.c
包含:
int main() {
int i;
size_t size;
char *line = NULL;
for (i=0;;++i) {
printf("\ngive me data: ");
if (getline(&line, &size, stdin) != -1) {
if (strcmp(line, "end\n") == 0) {
break;
}
printf("result: %d, %d\n", i, i*2);
}
}
return 0;
}
但我在屏幕上唯一得到的是
gonna write
wrote
gonna write
wrote
gonna write
wrote
我知道example
正在投放,但为什么我没有通过prc.stdout
获得任何内容?
PD:可能最好使用套接字或其他东西与example
进行通信,但这只是对我将使用另一个C程序的真实项目的测试。改变。
答案 0 :(得分:2)
需要fflush(stdout)
的原因是,因为stdio
检测到您没有在终端中运行,所以默认情况下不会在'\n'
上刷新,以提高数据吞吐量。
因此您可以显式刷新,或者只需使用
更改C代码中的缓冲模式setvbuf(stdout, NULL, _IOLBF, 0);
阅读this man page以了解详情。
答案 1 :(得分:0)
显然是在每stdout
之后修复它printf
的原因:
printf("result: %d, %d\n", i, i*2);
fflush(stdout);
我在看到nodejs脚本在关闭example.c时通过发送end\n
获得了所有输出后尝试了这一点。