3

修正できないと思われるコードがいくつかあります。次のようになります。

var childProcess = require('child_process');
var spawn = childProcess.spawn;
child = spawn('./simulator',[]);

child.stdout.on('data',
    function(data){
        console.log(data);
    }
);

これはすべて、特定のタイプのシミュレーションを実行している Web アプリケーションのバックエンドにあります。シミュレーターの実行可能ファイルは、(標準入力を介して) データが渡されるのを待っているループを実行する ac プログラムです。入力がシミュレーション用に (つまり、クライアントから) 入ってくると、入力を解析し、子プロセスの stdin にデータを書き込みます。次のように:

child.stdin.write(INPUTS);

現在、戻ってくるデータは 40,000 バイトです。しかし、データは 8192 バイトのチャンクに分割されているようです。Cプログラムの標準出力バッファを修正しようとしましたが、修正されません。node.jsによって課される「データ」イベントのサイズに制限があるかどうか疑問に思っていますか? 1 つのチャンクとして戻ってくる必要があります。

4

4 に答える 4

4

バッファ チャンク サイズはノードに適用されます。ノードの外で何をしても問題は解決しません。メッセージング プロトコルに少し余分な作業を加えずに、ノードから必要なものを取得する方法はありません。チャンク サイズより大きいメッセージはチャンク化されます。この問題を処理するには 2 つの方法があります。

  1. C からのストリーミングを開始する前に合計出力サイズがわかっている場合は、データの先頭にメッセージの長さを追加して、メッセージ全体を終了する前にプルするチャンクの数をノード プロセスが認識できるようにします。
  2. C プログラムから送信するメッセージに追加できる特殊文字を決定します。ノードがその文字を認識したら、そのメッセージからの入力を終了します。
于 2013-08-15T03:14:46.110 に答える
3

Web アプリケーションで IO を扱っている場合は、非同期メソッドを使用する必要があります。次のようなものが必要です(テストされていません)。ドキュメントStreamにAPI を使用する方法の良いサンプルがあります

var data = '';
child.stdout.on('data',
    function(chunk){
        data += chunk;
    }
);    

child.stdout.on('end',
    function(){
        // do something with var data
    }
);
于 2013-08-14T23:19:36.447 に答える
1

私は同じ問題に遭遇しました。いろいろ試してみて、だんだんイライラしてきました。特殊文字を先頭に追加して追加しようとしました。私は愚かだったのかもしれませんが、私はそれを正しく理解できませんでした。

基本的にすべてのチャンクを解析するlinerstreamというモジュールに遭遇しましたEOF。次のように使用できます。

process.stdout.pipe(new Linerstream()).on('data', (data) => {
    // data here is complete and not chunked 
});

stdout重要な部分は、で終わる行でデータを書き込む必要があることですEOF。そうでなければ、それが終わりであることを知りません。

これでうまくいったと言えます。うまくいけば、それは他の人に役立ちます。

于 2016-02-11T17:44:28.653 に答える
0

ppejovic のソリューションは機能しますが、私はconcat-streamを好みます。

var concat = require('concat-stream');
child.stdout.pipe(concat(function(data) {
    // all your data ready to be used.
});

問題の領域に基づいて検討する価値のある優れたストリーム ヘルパーが多数あります。substack のstream-handbookを見てください。

于 2013-08-15T00:54:33.590 に答える