/ / stdin / stdout Kommunikation zwischen Java-Programm und C-Programm unter 64-Bit-Windows 7 - Java, C ++, C, Windows-7

stdin / stdout Kommunikation zwischen Java-Programm und C-Programm unter 64-Bit-Fenstern 7 - Java, C ++, C, Windows-7

Ich habe ein C-Programm, das von Java erzeugt wirdProgramm. Das C-Programm gehört mir, während das Java-Programm von Drittanbietern stammt. Das Java-Programm richtet die Dinge irgendwie so ein, dass es über stdin / stdout mit meinem Programm kommuniziert.

Das System hat unter 32-Bit einwandfrei funktioniertWindows XP seit Jahren. Ich habe gerade eine neue Maschine mit 64-Bit-Windows 7 gekauft. Als ich das Java-Programm (über eine "DOS" -Box) ausführte, startete es mein Programm erfolgreich und schickte meinem Programm einen Befehl, auf den mein Programm erfolgreich reagierte. Aber als mein Programm wieder in seine Schleife mit ging

inputchar = getc(stdin);

Das getc (stdin) kehrt nie zurück.

Ein Hinweis: Ich weiß so gut wie nichts über Java und hatte Probleme, es überhaupt zum Laufen zu bringen. Es sah so aus, als hätte ich nach der Installation von java.com, wenn ich zu einem "dos" -Feld gegangen wäre und "java" eingetippt hätte, einen unbekannten Befehlsfehler erhalten. Ich fand dann eine java.exe auf windowssysWOW64, also tippte ich "windowssysWOW64 java -jar bla bla ..." und dann sah es so aus, als würde es laufen (zumindest bis zum getc (stdin) -Problem).

Irgendeine Idee, was schief gehen könnte? Benötige ich ein spezielles 64-Bit-Windows-7-Java? Ist es möglich, dass es sich nur um ein schlecht geschriebenes Java-Programm handelt, dessen Bugs sich nur auf einem neuen Betriebssystem manifestieren? Oder bin es eher ich?

BEARBEITEN: Mein C-Programm läuft auf dem 64-Bit-Windows-7-Computer einwandfrei (d. H. Nicht aus Java).

BEARBEITEN: Wenn ich "windowssyswow64java -version" eingebe, bekomme ich ...

java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)

EDIT: Auf der alten XP-Box war die Java-Version 1.6.0_17-b04

EDIT: Ich habe mein C-Programm für die neue Maschine nicht neu erstellt. Ich habe gerade die alte 32-Bit-Version kopiert.

BEARBEITEN: Der erste "Befehl", den das Java-Programm sendet, ist eine Zeichenfolge, die mit einem "Zeilenvorschub" (ASCII 10) endet.

Antworten:

2 für die Antwort № 1

Haben Sie versucht, ein anderes Java-Programm zu schreiben und Ihr C-Programm von dort aus zu starten? Grundsätzlich brauchen Sie nur etwas wie:

Process cPgm = Runtime.exec("your-C-program");
OutputStream stdin = cPgm.getOutputStream();
stdin.write("some-command".getBytes());
stdin.flush();
cPgm.waitFor();

Dies sollte Ihr Programm starten, ihm einen Befehl senden und warten, bis es beendet ist. Sie können auch anrufen cPgm.destroy() um Ihr Programm zu beenden, wenn es keinen Exit - Befehl hat. Ich nehme an, es könnte einfacher sein, das Problem zu analysieren, wenn Sie beide Seiten des Problems kontrollieren.

Haben Sie Ihr Programm kompiliert, um ein 64-Bit zu erstellenausführbar? Ich habe festgestellt, dass in Ihrem JRE-Pfad "WOW64" enthalten ist. Daher frage ich mich, ob er unter einer bestimmten Emulation ausgeführt wird (WOW kennzeichnet etwas, das im DOS-Kompatibilitätsmodus ausgeführt wird, auch bekannt als "Windows unter Windows"). . In diesem Fall wird möglicherweise eine Art Pufferung zwischen Prozessen durchgeführt, die möglicherweise erklärt, warum Ihr Lesevorgang nicht zurückkehrt.


0 für die Antwort № 2

Einige Details zur Behebung der 64-Bit-Probleme.

  1. Es gibt eine virtuelle 64-Bit-Java-Maschine. Wenn Sie die virtuelle 32-Bit-Maschine installieren, wird die Datei "java.exe" im Windows-Kompatibilitätsteil "Windows on Windows" (dh im 32-Bit-Kompatibilitätsteil) installiert. Wenn Sie die 32-Bit-Eingabeaufforderung starten würden ( c: windowssyswow64cmd.exe), Ich vermute, Sie könnten java.exe ausführen und das bekommen, was Sie erwarten. Wenn Sie die virtuelle 64-Bit-Java-Maschine installieren, sollten Sie sie über eine 64-Bit-Eingabeaufforderung starten können ( die Standardeinstellung), wie Sie es normalerweise tun würden.

    > Java-Version Java-Version "1.6.0_17" Java (TM) SE-Laufzeitumgebung (Build 1.6.0_17-b04) Java HotSpot (TM) 64-Bit-Server-VM (Build 14.3-b01, gemischter Modus)

  2. Sie sollten in der Lage sein, jedes 32-Bit-C auszuführenProzess von einem 32-Bit- oder 64-Bit-Java-Prozess (es sollte keine Rolle spielen). Die Tatsache, dass es aufgehängt wird, zeigt mir an, dass die Bytes möglicherweise nicht wie erwartet übergeben werden. Was erwarten Sie von getc (stdin) im C-Programm, wenn es dort hängt? Es ist möglich, dass die getc - Implementierung unter Windows 7 anders ist als unter XP, aber das scheint unwahrscheinlich.


0 für die Antwort № 3

Führen Sie den Befehl an der Eingabeaufforderung eines Administrators aus? Wenn nicht, würde ich das versuchen (beim Starten der Eingabeaufforderung mit der rechten Maustaste klicken und Als Administrator ausführen auswählen).

Windows Vista und 7 bieten eine Funktion namens UAC, was bedeutet, dass auch wenn Sie ein sindAdministrator, Ihr Konto hat keine Administratorrechte. Dieser Effekt kann sich auf die Berechtigungen auswirken, die Ihrem Programm, dem Java-Programm oder der Java Virtual Machine zur Verfügung stehen.