Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
64位windows7下Java程序与C程序的stdin/stdout通信_Java_C++_C_Windows 7 - Fatal编程技术网

64位windows7下Java程序与C程序的stdin/stdout通信

64位windows7下Java程序与C程序的stdin/stdout通信,java,c++,c,windows-7,Java,C++,C,Windows 7,我有一个C程序,它是从Java程序派生出来的。C程序是我的,而Java程序是第三方的。Java程序以某种方式进行设置,以便通过stdin/stdout与我的程序通信 多年来,该系统在32位WindowsXP下运行良好。我刚买了一台64位Windows7的新机器。当我运行Java程序(从“dos”框中)时,它成功地启动了我的程序,并向我的程序发送了一条命令,我的程序成功地执行了该命令。但是当我的程序回到它的循环中 inputchar = getc(stdin); getc(stdin)永远不会返

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

多年来,该系统在32位WindowsXP下运行良好。我刚买了一台64位Windows7的新机器。当我运行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程序,它的bug只有在运行新操作系统时才会显现出来吗?还是更有可能是我

编辑:我的C程序在64位Windows7机器上运行良好(即不是从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)结尾的字符串。

您是否尝试过编写不同的java程序并从中启动您的C程序?基本上,您只需要以下内容:

Process cPgm = Runtime.exec("your-C-program");
OutputStream stdin = cPgm.getOutputStream();
stdin.write("some-command".getBytes());
stdin.flush();
cPgm.waitFor();
这将启动您的程序,向它发送一些命令,然后等待它退出。如果程序没有exit命令,还可以调用
cPgm.destroy()
终止程序。我只是想,如果你能控制问题的两面,分析问题可能会更容易


您是否已编译程序以创建64位可执行文件?我注意到你的JRE的路径中有“WOW64”,这让我怀疑它是否在某种模拟下运行(WOW用来表示在DOS兼容模式下运行的东西,也称为“Windows上的Windows”)。如果是这样,那么可能会出现某种进程间缓冲,这可能解释了您的读取没有返回的原因。

一些详细信息有助于解决64位问题

  • 有一个64位Java虚拟机。安装32位虚拟机时,java.exe将安装到Windows的“Windows on Windows”兼容部分(即32位兼容部分)。如果要启动32位命令提示符(c:\Windows\syswow64\cmd.exe),我怀疑您将能够运行java.exe并获得所需的结果。如果安装64位java虚拟机,您应该能够像平常一样从64位命令提示符(默认)启动它

    >java版本 java版本“1.6.0_17” Java(TM)SE运行时环境(build 1.6.0_17-b04) Java HotSpot(TM)64位服务器虚拟机(构建14.3-b01,混合模式)

  • 您应该能够从32位或64位Java进程执行任何32位C进程(这不重要)。它挂起的事实向我表明,可能字节没有按照您的预期传递。在C程序中,您希望getc(stdin)是什么当它挂起时返回?getc实现可能在Windows7和XP上有所不同,但这似乎不太可能


  • 是否从管理员的命令提示符下运行该命令?如果不是,我会尝试(在启动命令提示符时,右键单击并选择“以管理员身份运行”)


    Windows Vista和7增加了一个被调用的特性,这意味着即使你是管理员,你的帐户也没有被授予管理员权限。这种影响可能会影响到你的程序或java程序或java虚拟机的特权。

    C或C++。你的标题是C++,但是在其他地方,它似乎是C. I。TS实际上是一个程序,它在C中开发了25年,但是在过去6个月里,它被迫运行在C++中。它的99.9%个旧C,因此使用了像GETCH()这样的代码。我知道什么,我将它标记为C和C++。添加Java java的输出到您的问题。您是否已经成功地从这个方框上的命令提示符运行程序?(不是由java程序生成)“当getc(stdin)挂起时,您希望它返回什么?”…通信序列中的下一个字符是“n”(ASCII 110)。在这种情况下,听起来java程序无法完成从您的程序读取响应(如果它这样做了),或者无法发出下一个命令。