2016-07-16 3 views
0

Ich habe ein einfaches C++ - Programm kompiliert mit Befehl gcc 1.cpp -o 1.exe.Vollständig interagierenden untergeordneten Prozess in Node.js

// 1.cpp  
#include <stdio.h> 
int main(){ 
    int a = 0; 
    scanf("%d", &a); 
    printf("%d", a + 1000); 
    scanf("%d", &a); 
    printf("\n%d", a + 1000); 
    return 0; 
} 

Mein Ziel ist es Node.js-Anwendung zu erstellen, die die Lage sein wird, eine Nummer zu 1.exe passiert, dann Ergebnis anzuzeigen, und nach dem Durchlauf angezeigten Ergebnis als nächste Nummer. Schließlich muss die Anwendung das zweite Ergebnis schreiben und dann schließen.
Ich habe in Node.js Manuals und Dokumentationen und auch auf anderen Websites gesucht, aber ich kann immer noch nicht herausfinden, wie interaktiver Kindprozess in Node.js erstellt wird. Der folgende Code funktioniert einfach nicht.

var cp = require('child_process'); 
var proc = cp.spawn(pathToFile); 
var n = 0; 

proc.stdout.on('data', function(a){ 
    process.stdout.write(a); 
    if(!n++) proc.stdin.write(a + '\n'); 
}); 

proc.stdin.write('1\n'); 

Die Funktion proc.stdout.on(data, ...) wird nie erreicht werden, weil es nur beendet werden, wenn Kind-Prozess genannt wird. Problem ist, weil es beendet wird, wenn die zweite Nummer übergeben wird, aber die zweite Nummer wird übergeben, wenn das erste Ergebnis empfangen wird. Ich habe viele Kombinationen und viele Optionen in cp.spawn Funktion ausprobiert, aber nichts hat so funktioniert, wie ich es erwartet hatte.
Der Grund, ich möchte vollständig interaktive untergeordnete Prozess ist, weil ich Node.js-Modul erstellen möchten, die externe Anwendung verwenden, die eine lange Zeit zum Laden benötigt, so einfacher ist Kinderprozess aktiv zu halten und nur Daten über STDIO zu senden und zu empfangen .
Die C++ - Anwendung ist nur ein Beispiel. Die reale Anwendung, mit der Node.js interagieren soll, kann ich nicht bearbeiten. Erwarten Sie also nicht, dass ich den Code dieser Anwendung ändere. Ich muss Node.js-Code anpassen, um mit der Anwendung zu interagieren, nicht umgekehrt. Wenn ich eine externe Anwendung mit der Eingabeaufforderung ausführe, erhalte ich eine Ausgabe nach jeder Eingabezeile, so dass es kein Problem mit dieser Anwendung ist.
Irgendwelche Ideen, wie man voll interagierenden Kindprozess macht?

Antwort

0

Haben Sie versucht fflush?

printf("%d", a + 1000); 
fflush(stdout); 

ok du hast gesagt, dass du den c-code nicht ändern kannst. aber in diesem Fall schlage ich vor, dass Sie ein weiteres C-Programm (broker.c) zwischen Knoten & 1.cpp schreiben. und rufen Sie broker.cpp vom Knoten auf.

+0

Haben Sie meine Frage bis zum Ende gelesen? Ich sagte, dass C++ App nur ein Beispiel ist. Ich habe andere Anwendungen, die ich nicht ändern oder Code einfügen kann, weil ich nicht den Quellcode habe. –

+0

Sie haben meine Frage noch nicht gelesen. Diese Anwendung sendet Daten (wenn Sie sie beispielsweise über die Eingabeaufforderung ausführen, können Sie eine beliebige Zahl übergeben, und die Anwendung zeigt sofort das Ergebnis an). Das Problem liegt darin, dass die Anwendung tty benötigt, um sie sofort anzuzeigen, nicht die Pipe. Ich brauche eine Methode, um Tty in Node.js zu simulieren, so dass die Anwendung sich wie in der Eingabeaufforderung ausgeführt verhält. –

+0

können Sie eine Sache tun. schreibe weitere C-Programme, um mit dem Programm zu kommunizieren. und wenn das funktioniert. Rufen Sie dann Ihr C-Programm vom Knoten auf. – enRaiser