2016-10-17 4 views
2

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を変更できないということです。私はバイナリしか持っていません。

答えて

0

は、あなたはどのようにパイプの子プロセス/フォークについてのドキュメントとを読み取る必要が親プロセスに子出力: https://nodejs.org/api/child_process.html#child_process_options_stdio

  • 「パイプ」 - [「パイプ」と同じ、「パイプ'、' pipe '](デフォルト)
  • ' ignore '、' ignore '、' ignore '、' ignore 'と同じです。
  • [継承] - [process.stdin、process.stdout、 process.stderr]または[0,1,2]

あなたのケースでは、出力ともっと複雑なことをする必要がなければ、on.dataイベントリスナーを取り除き、生成されたプロセスを継承オプションで初期化することができます。私は、ps.killが呼び出されたことをより明確にするためにSIGINTイベントバインディングを変更しました。

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

var ps = spawn('./echo', { stdio: 'inherit' }); 

process.on('SIGINT', function(){ 
    console.log('sigint received'); 
    ps.kill(); 
}); 
+0

これは素晴らしいことです。もう1つの質問は、まだon.dataを使用している場合です。この問題を解決する方法はありますか? – yuizhou

+0

@yuizhou私はちょうどあなたのコードが同様に動作することを知った。バッファリングされる特定のサイズがあり、特定のポイントの後に結果がコンソールに表示されていることがわかります。 echo.cファイルを変更し、より大きな文字列を含むprintfsを追加すると、これが起こります。 –

+0

私はそれをLinux環境で実行します。エコープログラムの出力がstdoutのときは到着時に自動的にフラッシュされますが、他の出力先にリダイレクトされると、その出力は4Kサイズのバッファに入れられます。私は、バッファがいっぱいになったとき、またはリダイレクトのときにプロセスが終了したときだけ出力を見ることができます。バッファーのサイズを変更したり、nodejsプログラムでストリームをフラッシュしたりすることができますか?私はリダイレクトの場合にエコープログラムを変更できないためです。 – yuizhou

0

私はexecaが役に立ちます。

+0

私はこのlibは同期プロセスに使用されると思いますが、私が呼び出すCプログラムにはwhile-trueループが含まれています。ユーザーの終了まで停止できません。だから、このライブラリは私の場合は分かりません。とにかくありがとうございました。 – yuizhou

関連する問題