2017-04-13 47 views
1

当我从命令行运行myProgram时,输出会在生成时实时显示。当我像这样从节点产生它时,stdout缓冲区并一次出现一个大块。派生child_process标准输出到'readline'没有缓冲节点?

const bat = require('child_process').spawn('myProgram', []); 
bat.stdout.setEncoding('utf8'); 
bat.stdout.on('data', console.log); 

我该如何告诉child_process不要缓冲stdout?或者设置更小的缓冲区大小?

下一次尝试:

const spawn = require('child_process').spawn; 

var options = { 
    stdio: ["ignore", process.stdout, "ignore"] 
}; 

const bat = spawn('myProgram', [], options); 

const rl = require('readline').createInterface({ 
    input: process.stdout 
}); 

rl.on('line', function(line) { 
    console.log(line); 
}); 

这将打印process.stdout到终端,但readline没有得到数据,即使documentation saysprocess.stdout“......是复式流......”

+1

尝试用'require('child_process')替换整个代码块。spawn('myProgram',{stdio:[“ignore”,process.stdout,“ignore”]})' – MultiplyByZer0

+0

Thanks - that works to无缓冲地传递给控制台。我真正需要做的是流入'readline'。这可以做到无缓冲吗? –

+0

具体来说,stdio参数可以是“tty,文件,套接字或管道”流。我如何创建一个可以在那里工作的流,让readline在它到达时立即吐出一行,而不是等待一个大的缓冲区? –

回答

1

也许是最容易让spawn创建一个新的标准输出流,并传递到readline

const bat = spawn('myProgram'); 
const rl = require('readline').createInterface({ input: bat.stdout }); 

编辑:好吧,问题不是这么多节点,但C/C++标准输出缓冲。如果你管你的程序通过cat输出,它也不会显示在系统产生它的输出:

./main | cat 

既然你的代码,最简单的解决将是对stdout禁用缓冲:

#include <stdio.h> 

setbuf(stdout, NULL); 

或者,在每个printf()之后呼叫fflush(stdout)

+0

来自'readline'的输出在缓冲后每次都有很多行。如何强制'readline'在每次出现myProgram时发出一行? –

+0

你在使用什么操作系统?我测试了各种程序,输出行和“睡眠”之间,每一行都被“readline”拾取,一旦它生成。当你通过诸如'cat'之类的东西运行程序的输出时会发生什么?当连接到管道而不是终端时,程序的输出可能会有所不同。 – robertklep

+0

OSX 10.11.6 /节点5.0.0 –