2009-06-17 2 views
1

Ich habe eine Java-Anwendung, die hier eine C++ App über die java.lang.Process API startet und dann versucht, Befehle, um es über das stdin Rohr zu senden:Kommunikationsproblem zwischen Java und C++ App auf stdin

 
process.getOutputStream().write("foo\n"); 
process.getOutputStream().flush(); 

Auf der C++ - Seite gibt es eine Schleife läuft, die für die Eingabe in Stdin überprüft und wenn es es liest es. Leider gibt die Überprüfung immer 0 zurück, daher versucht es nie zu lesen. Wenn ich den Check entferne, werden plötzlich die Befehle angezeigt und verarbeitet. Dies ist auf Linux.

Der C++ Anwendungen Code und von stdin lesen zu überprüfen, ist dies:

 
fd_set fds; 
FD_ZERO (&fds); 
FD_SET (0, &fds); 

struct timeval tv; 
tv.tv_sec = 0; 
tv.tv_usec = 0; 


if(select (1, &fds, 0, 0, &tv) > 0) { 
    char buf[16384]; 
    buf[16383] = '\0'; 
    if (fgets (buf, sizeof (buf) - 1, stdin) == 0) 
     return; 
} 

Wie gesagt, das Entfernen der if-Klausel macht es Arbeit, aber natürlich das ist nicht so schön wie die Schleife um es auch tut einige andere Dinge. Hat jemand eine Idee, was ich hier falsch mache?

Update: Inzwischen konnte ich das Problem mit zwei sehr kleinen Beispiel-Apps reproduzieren. Das Problem scheint hier mit dem Qt-Framework in Verbindung zu stehen, sobald ich die QCoreApplication-Instanz für das Framework erstellt habe, scheint select() für stdin nicht mehr zu funktionieren.

+0

sollte verwenden ' fgets (buf, sizeof (buf), stdin) 'nicht' sizeof (buf) - 1' – user102008

Antwort

0

Ich mag falsch sein, aber hat eine Zeitüberschreitung von 0 für den select Aufruf sinnvoll? Ich würde versuchen, den Zeitüberschreitungswert zu erhöhen.

+0

Ändert nichts um es zu erhöhen (probiert bis zu 500 usecs) –

1

Sie haben zwei Wenn's; Entfernen, welches macht es funktioniert?

Nichtwarten auf eine neue Zeile, Puffer voll, oder EOF, bevor es zurückkehrt? Ich sehe nicht, dass Sie eine neue Zeile schreiben, "foo" füllt den Puffer nicht, und da der Stream nicht geschlossen ist, sieht er ein EOF?

+0

Das erste wenn und ja, das habe ich geschrieben hier spiegelte sich nicht, was ich im Code habe, Das hat sich geändert. –

0

Ich erinnere mich, dass es eine Menge Argumente über die Semantik und Operation von select() und ein paar Ersetzungen dafür gibt. Sie könnten sich diese ansehen.

Wie wird der Stream, den Sie gerade lesen, erstellt/geöffnet? Ist es ein gepufferter Strom? Vielleicht bekommst du nichts, weil es nicht in den Stream geschrieben wurde, bis der Schreibprozess es löscht?

Die andere Sache, die Sie versuchen könnten, ist es auf einen Thread mit blockierenden I/O anstelle von Polling setzen.

Viel Glück mit ihm

0

Stellt sich heraus, es ist nicht die QCoreApplication wie ich jetzt das Problem, zweimal mit heraus reproduzieren konnten. Scheint so, als ob das Problem das fgets() ist, das ich benutze, indem ich das durch read() repariere.

0

Ist die unten in der While-Schleife? Wenn nicht, sollte es sein.

FD_ZERO (&fds); 
FD_SET (0, &fds); 

struct timeval tv; 
tv.tv_sec = 0; 
tv.tv_usec = 0; 

Wenn die Antwort auf meine erste Frage ist ja, dann versuchen Sie bitte dieses Timeout:

tv.tv_sec = 0; 
tv.tv_usec = 1; 

Wenn die oben nicht funktioniert, versuchen Sie dies:

while(fgets(buf, sizeof (buf) - 1, stdin) !=NULL) 
{ 
} 
+0

sollte 'sizeof (path)' anstelle von 'sizeof (path) -1' sein – user102008