64位Windows 7下Java程序和C程序之间的标准输入/输出通信

3
我有一个C程序,它是从Java程序中生成的。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)问题出现之前是这样的)。

有什么想法可能出了什么问题?我需要一个特殊的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)结尾的字符串。


这实际上是一个使用 C 语言开发超过 25 年的程序,但在过去的6个月中被迫改用 C++ 运行。由于它99.9%采用了旧的 C 代码,因此会使用像 getc() 这样的代码。 - Mick
我知道了,我会将它标记为C和C++! - Mick
1
请在您的问题中添加java --version的输出。 - Denis Tulskiy
1
你是否已经在此计算机的命令提示符中成功运行了该程序(而非由Java程序生成)? - Liz Albin
好的,那就不用考虑Java部分了 :) 。在这种情况下,我所说的管道是指 > 和 <。 - Liz Albin
显示剩余4条评论
3个回答

2

您尝试过编写另一个Java程序并从中启动C程序吗?基本上,您只需要像这样:

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

这将启动您的程序,发送一些命令,然后等待其退出。如果您的程序没有退出命令,您还可以调用来终止它。我认为如果您控制问题的双方,分析问题可能会更容易。
您是否编译程序以创建64位可执行文件?我注意到您的JRE路径中有“WOW64”,这让我想知道它是否在某种仿真下运行(WOW曾经表示在DOS兼容模式下运行的东西,也就是“Windows on Windows”)。如果是这样,那么可能会发生某种进程间缓冲,这可能解释为什么您的读取没有返回。

0

一些细节帮助解决64位问题。

有一个64位的Java虚拟机。当你安装32位的虚拟机时,java.exe被安装到Windows上的“Windows on Windows”兼容部分(即32位兼容部分)。如果你启动32位命令提示符(c:\ windows \ syswow64 \ cmd.exe),我认为你应该能够运行java.exe并得到期望的结果。如果你安装64位的Java虚拟机,你应该能够像平常一样从64位命令提示符(默认)中启动它。 > java -version java version "1.6.0_17" Java(TM) SE Runtime Environment (build 1.6.0_17-b04) Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)
你应该能够从32位或64位的Java进程执行任何32位C进程(这应该没有关系)。事实上它卡住了,这表明您期望的字节可能没有被传递。在C程序中,当getc(stdin)被卡住时,你期望它返回什么?Windows 7和XP上的getc实现可能不同,但这似乎不太可能。

当getc(stdin)挂起时,您期望它返回什么?下一个字符在通信序列中是'n'(ASCII 110)。 - Mick
在这种情况下,听起来像是Java程序未能完成从您的程序读取响应(如果它这样做),或者它未能发出下一个命令。 - Jason R. Coombs

0

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

Windows Vista和7添加了一个名为UAC的功能,这意味着即使您是管理员,您的帐户也不会被赋予管理员特权。这种影响可能会影响到您的程序或Java程序或Java虚拟机可用的特权。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接