在64位Windows 7下Java程序和C程序之间的stdin / stdout通信

时间:2010-02-02 18:40:57

标签: java c++ c windows-7

我有一个从Java程序中生成的C程序。 C程序是我的,而Java程序是第三方。 Java程序以某种方式进行设置,以便通过stdin / stdout与我的程序进行通信。

多年来,该系统在32位Windows XP下运行良好。我刚刚购买了一台装有64位Windows 7的新机器。当我运行Java程序时(从“dos”框),它成功启动了我的程序,它向我的程序发送了一个命令,我的程序成功地执行了该命令。但是当我的程序回到

的循环时
inputchar = getc(stdin);

getc(stdin)永远不会返回。

一条线索:我对Java几乎一无所知,而且我确实在首先运行它时遇到了一些麻烦。似乎从java.com安装后,如果我进入“dos”框并键入“java”,我只是得到一个无法识别的命令错误。然后我在windows \ sysWOW64上找到了一个java.exe,所以我键入了“windows \ sysWOW64 java -jar blah blah ...”,然后程序看起来像是在运行(至少直到getc(stdin)问题)。 / p>

知道可能出现什么问题吗?我需要一个特殊的64位Windows-7 Java吗?是不是有可能它只是一个写得很糟糕的java程序,只有在新操作系统上运行时才会出现错误?或者它更可能是我?

编辑:我的C程序在64位Windows 7机器上运行良好(即不是从java生成)。

编辑:如果我输入“\ windows \ syswow64 \ java -version”,那么我得到......

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)

编辑:在旧的XP盒子上,java版本是1.6.0_17-b04

编辑:我没有为新机器重新构建我的C程序。我只是复制了旧的32位版本。

编辑:java程序发送的第一个“命令”是以“换行”字符(ASCII 10)结尾的字符串。

3 个答案:

答案 0 :(得分: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”)。如果是这样,那么可能会进行某种进程间缓冲,这可能解释了为什么您的读取没有返回。

答案 1 :(得分:0)

有助于解决64位问题的一些细节。

  1. 有一个64位的Java虚拟机。当您安装32位虚拟机时,java.exe将安装到Windows的“Windows on Windows”兼容性部分(即32位兼容性部分。如果您要启动32位命令提示符( c:\ windows \ syswow64 \ cmd.exe),我怀疑你能够运行java.exe并得到你所期望的。如果你安装了64位Java虚拟机,你应该可以从64启动它。像往常一样使用-bit命令提示符(默认值)。

    > java -version java版“1.6.0_17” Java(TM)SE运行时环境(版本1.6.0_17-b04) Java HotSpot(TM)64位服务器VM(内置14.3-b01,混合模式)

  2. 您应该能够从32位或64位Java进程执行任何32位C进程(应该没关系)。它挂起的事实告诉我,可能没有像你期望的那样传递字节。在C程序中,你期望getc(stdin)在它挂起时返回什么?在Windows 7和XP上,getc实现可能会有所不同,但这似乎不太可能。

答案 2 :(得分:0)

您是否从管理员的命令提示符运行命令?如果没有,我会尝试(在启动命令提示符时,右键单击并选择以管理员身份运行)。

Windows Vista和7添加了一项名为UAC的功能,这意味着即使您是管理员,您的帐户也不会获得管理员权限。此效果可能会影响程序或Java程序或Java虚拟机可用的权限。