2017-04-13 49 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 –