2017-08-02 1 views
3

Ich verwende die npm-Bibliothek 'child_process' in einem Elektronenprojekt, um den Strom der Standardausgabe von einem C-Programm mit Spawn zu erfassen. Wenn ich jedoch versuche, die Ausgabe von 'printf' oder 'fprintf' zu protokollieren, die von child.stdout.on ('data') erfasst wurde, wird nichts angezeigt. Das ist mein Testcode:Child_process nicht binäre Dateiausgabe erfassen?

#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; 
} 

Ich weiß, dass mein Javascript korrekt ist, weil die Leitung durch den Systemaufruf echo'ed erfaßt, und ich habe es mit ähnlichen Schleifen in einem Ruby-Skript getestet und ein Bash-Skript und sie haben gut funktioniert.

Wenn ich die binäre Datei in einer Terminal-Shell ausführen, wird alles gut ausgegeben, aber wenn ich versuche, alle drei Ausgänge (erste Zeile sollte "echo 0 \ n echo 0 \ n 0") mit child.stdout zu erfassen. on ('Daten', (Daten) => {...}); Das einzige, was ich zurückbekomme, ist, wie gesagt, die "0" vom Systemanruf. Ich bin ratlos für die Lösung.

Es kann bemerkenswert sein, dass, wenn ich dieses Programm im Terminal ausführen, kann ich nicht^C verwenden, um es zu beenden, wie es nur von stdin abgeholt und den Bildschirm mit der Ausgabe hochgetragen wird.

Hier ist mein Javascript, falls erforderlich:

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

Haben Sie versucht, 'fflush (stdout);' aufzurufen oder die Pufferung der Standardausgabe in Ihrem C-Programm zu deaktivieren? – mscdex

+0

@mscdex Das hat den Trick gemacht. Kennst du die Logik dahinter? –

Antwort

2

printf()/fprintf() puffert seine Ausgabe standardmäßig. Sie können entweder manuell fflush(stdout); nach Ihren Anrufen auf fprintf() rufen Sie die gepufferte Ausgabe zu zwingen nach stdout oder können Sie deaktivieren vollständig mit setvbuf(stdout, NULL, _IONBF, 0); Pufferung (dies einmal getan werden muss, und vor jede Ausgabe auf stdout).