2010-02-02 3 views
3

У меня есть программа на C, которая генерируется из программы Java. Программа C - моя, а программа Java - сторонняя. Java-программа каким-то образом устанавливает все, чтобы она связывалась с моей программой через stdin/stdout.Связь stdin/stdout между Java-программой и программой C под 64-битными окнами 7

В течение многих лет система работает под 32-разрядной Windows XP. Я только что купил новую машину с 64-разрядной Windows 7. Когда я запустил программу Java (из окна «dos»), она успешно завершила мою программу и отправила моей программе команду, с которой моя программа успешно действовала. Но когда моя программа вернулась к своей петле с

inputchar = getc(stdin); 

getc (stdin) никогда не возвращается.

Ключ: я почти ничего не знаю о Java, и у меня были проблемы с его запуском в первую очередь. Казалось, что после установки его с java.com, если я перешел в поле «dos» и набрал «java», я получил нераспознанную ошибку команды. Затем я нашел java.exe на windows \ sysWOW64, поэтому набрал «windows \ sysWOW64 java -jar blah blah ...», а затем программа выглядела так, как будто она работала (по крайней мере, до проблемы getc (stdin)).

Любая идея, что может пойти не так? Нужна ли мне специальная 64-битная Windows-7 Java? Возможно ли, что его просто плохо написанная программа Java, чьи ошибки проявляются только при работе на новой ОС? Или, скорее всего, я буду?

EDIT: моя программа на C работает отлично (т. Е. Не из java) на 64-битной машине Windows 7.

EDIT: Если я типа "\ Windows \ syswow64 \ Java -версии", то я получаю ...

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: На старой XP поле версия Java была 1.6.0_17-b04

EDIT: Я не перестроил свою программу на C для новой машины. Я просто скопировал старую 32-битную версию.

EDIT: первая «команда», которую посылает программа Java, представляет собой строку, заканчивающуюся символом «line feed» (ASCII 10).

+0

C или C++? Ваш заголовок говорит о C++, но везде, где это похоже C. –

+0

На самом деле это программа, которая была разработана более 25 лет в C, но затем за последние 6 месяцев была запущена на C++. Его 99.9% old-C, следовательно, используется код типа getc(). – Mick

+0

Я знаю, что, я помечаю его как C и C++! – Mick

ответ

2

Вы пробовали написать другую программу на Java и запустить свою программу на C? В принципе, вам просто нужно что-то вроде:

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

Это должно запустить программу, отправить ему какую-либо команду, а затем ждать его, чтобы выйти. Вы также можете позвонить cPgm.destroy(), чтобы завершить свою программу, если у нее нет команды выхода. Я просто считаю, что было бы легче проанализировать проблему, если вы будете контролировать обе стороны проблемы.

Вы скомпилировали свою программу для создания 64-битного исполняемого файла? Я заметил, что в вашем пути JRE есть «WOW64», что заставляет меня задаться вопросом, работает ли он под какой-то эмуляцией (WOW используется для указания того, что было запущено в режиме совместимости DOS, иначе «Windows на Windows»). Если это так, то может произойти какая-то межоперационная буферизация, которая может объяснить, почему ваше чтение не возвращается.

0

Некоторые детали, чтобы помочь с 64-разрядными проблемами.

  1. Существует 64-битная виртуальная машина Java. Когда вы устанавливаете 32-битную виртуальную машину, java.exe устанавливается в часть совместимости Windows «Windows Windows» (то есть 32-разрядная совместимая часть. Если вы должны были запустить 32-битную командную строку (c: \ windows \ syswow64 \ cmd.exe), я предположим, что вы сможете запустить java.exe и получить то, что ожидаете. Если вы установите 64-битную виртуальную машину Java, вы сможете запустить ее из 64-разрядной командной строки (по умолчанию), как обычно.

    > Java -версия Java версия "1.6.0_17" Java (TM) SE Runtime Environment (сборка 1.6.0_17-b04) Java HotSpot (TM) 64-разрядный сервер VM (сборка 14.3-b01, смешанная режим)

  2. Вы должны иметь возможность выполнить любой 32-разрядный процесс C из 32-разрядного или 64-битный Java-процесс (это не имеет значения). Тот факт, что он повесил трубку, указывает на то, что, возможно, байты не передаются, как вы ожидаете. В программе C, что вы ожидаете, когда getc (stdin) вернется, когда он там повесится? Возможно, реализация getc может отличаться в Windows 7 и XP, но это кажется маловероятным.

+0

", что вы ожидаете, когда getc (stdin) вернется, когда он там там повесится?» ... следующий символ в последовательности сообщений - это «n» (ASCII 110). – Mick

+0

В этом случае, похоже, что программа Java не может завершить чтение ответа от вашей программы (если это так) или не выдаст следующую команду. –

0

Вы используете команду из командной строки администратора? Если нет, я бы попробовал это (при запуске командной строки щелкните правой кнопкой мыши и выберите «Запуск от имени администратора»).

Windows Vista и 7 добавили функцию под названием UAC, а это значит, что даже если вы являетесь администратором, вашей учетной записи не предоставляются привилегии администратора. Этот эффект может повлиять на привилегии, доступные вашей программе или программе Java или виртуальной машине Java.

Смежные вопросы