nodejsからspawnを使って実行可能なCプログラムを呼び出すが、毎回Cプログラムがフラッシュされていないようだ。次に、私のノードプログラムは、バッファが満杯(4K)または子プロセスが終了したときにのみ、子プロセスのstdoutを出力することができます。単にシナリオnodejsから子プロセスをフラッシュするには
、二つの部分のコードは次のようになります。私は得ることができますどのように
invoke.js
var spawn = require("child_process").spawn;
var ps = spawn("./echo");
ps.stdout.on("data", (data) => {
console.log(`${data}`);
});
process.on("SIGINT", ps.kill);
echo.c
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
static volatile int keep = 1;
void intHandler(int d){
keep = 0;
}
int main(){
signal(SIGINT, intHandler);
int count = 0;
while(keep) {
printf("%d hello world!\r\n", ++count);
sleep(1);
}
}
invoke.js synchronusのエコーからの出力? 1つの重要なことは、私はecho.cを変更できないということです。私はバイナリしか持っていません。
これは素晴らしいことです。もう1つの質問は、まだon.dataを使用している場合です。この問題を解決する方法はありますか? – yuizhou
@yuizhou私はちょうどあなたのコードが同様に動作することを知った。バッファリングされる特定のサイズがあり、特定のポイントの後に結果がコンソールに表示されていることがわかります。 echo.cファイルを変更し、より大きな文字列を含むprintfsを追加すると、これが起こります。 –
私はそれをLinux環境で実行します。エコープログラムの出力がstdoutのときは到着時に自動的にフラッシュされますが、他の出力先にリダイレクトされると、その出力は4Kサイズのバッファに入れられます。私は、バッファがいっぱいになったとき、またはリダイレクトのときにプロセスが終了したときだけ出力を見ることができます。バッファーのサイズを変更したり、nodejsプログラムでストリームをフラッシュしたりすることができますか?私はリダイレクトの場合にエコープログラムを変更できないためです。 – yuizhou