我正在尝试创建一个非常简单的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:也许使用sockets或其他东西来与
example
通信会更好,但这只是对一个实际项目的测试,在这个项目中,我将使用另一个我无法更改的C程序。 最佳答案
需要fflush(stdout)
的原因是,因为stdio
检测到您没有在终端中运行,所以它默认不会在'\n'
上刷新,以提高数据吞吐量。
所以可以显式刷新,或者只需使用
setvbuf(stdout, NULL, _IOLBF, 0);
阅读this man page了解更多信息。
关于c - 无法从子进程的标准输出中获取任何东西,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22273865/