无法从subprocess的标准输出中获取任何内容
我试图做一个非常简单的nodejs服务器,接收post请求,并将它们提供给一个简单的C程序,通过stdin和stdout使其所有的I / O。 我正在尝试使用以下脚本作为testing:
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
进行通信会更好,但这仅仅是一个真正项目的testing,在这个项目中,我将使用另一个不能更改的C程序。
需要fflush(stdout)
理由是,因为stdio
检测到你没有在terminal运行,所以默认情况下不会在'\n'
上刷新,以提高数据吞吐量。
所以你可以明确地刷新,或者简单地用C代码改变缓冲模式
setvbuf(stdout, NULL, _IOLBF, 0);
阅读此手册页以了解更多信息。
显然是什么修复它是每个printf
后冲洗stdout
:
printf("result: %d, %d\n", i, i*2); fflush(stdout);
我看到nodejs脚本在example.c被closures时(通过发送end\n
)获得了所有的输出。