2017-08-02 7 views
3

電子プロジェクトでnpmライブラリ 'child_process'を使用して、Cプログラムから標準出力のストリームを取得して生成します。しかし、child.stdout.on( 'data')によって取得された 'printf'または 'fprintf'の出力をログに記録しようとすると、何も表示されません。これは私のテストコードです:Child_processはバイナリファイル出力をキャプチャしていませんか?

#include <stdio.h> 
#include <string.h> 

int main(){ 
    char buffer[256]; 
    int i = 0; 
    while(1){ 
     snprintf(buffer, sizeof(buffer), "echo %d\n", i); 
     printf("%s\n", buffer); 
     fprintf(stdout, "%s\n", buffer); 
     system(buffer); 
     system("sleep 1"); 
     i++; 
    } 
    return 0; 
} 

私はシステムコールによってecho'ed行がキャプチャーされ、私はRubyスクリプトとbashスクリプトに似たループでそれをテストしているので、私のjavascriptのが正しいことを知っていて、彼らはうまくいった。

ターミナルシェルでバイナリファイルを実行すると、すべてがうまく出力されますが、child.stdoutを使用して3つの出力(最初の行は "echo 0 \ n echo 0 \ n 0")をキャプチャしようとします。 on( 'data'、(data)=> {...});私が返すのは、私が言ったように、システムコールからの "0"だけです。私は解決策を失っている。

このプログラムをターミナルで実行すると、^ Cを使用して終了することはできません。これはstdinによってピックアップされ、出力とともに画面を運びます。必要であれば、ここで

は私のjavascriptです:

const { spawn }= require('child_process'); 
let test; 

// Invoked by a button that when clicked calls ipcRenderer.send('test'); 
ipcMain.on('test', (event, ...args) => { 
    test = spawn('./a.out', []); 
    test.stdout.on('data', (data) => { 
    console.log(data); 
    }); 
}); 
+0

Cプログラムで 'fflush(stdout);を呼び出すか、stdoutバッファリングを無効にしましたか? – mscdex

+0

@mscdexそれはトリックでした。あなたはこの背後にある論理を知っていますか? –

答えて

2

printf()/fprintf()は、デフォルトでは、その出力をバッファリング。あなたは手動をstdoutにかあなたは(これはstdoutに一度と前任意の出力に行われなければならない)setvbuf(stdout, NULL, _IONBF, 0);で完全にバッファリングを無効にすることができ、バッファリングされた出力を強制的にfprintf()にあなたの呼び出しの後fflush(stdout);を呼び出すことができます。

関連する問題