簡體   English   中英

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

[英]stdin/stdout communication between Java program and C program under 64 bit 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)問題)。

什么可能出錯? 我需要一個特殊的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)結尾的字符串。

您是否嘗試過編寫不同的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”)。 如果是這樣,那么可能會進行某種進程間緩沖,這可能解釋了為什么您的讀取沒有返回。

一些細節可以幫助解決64位問題。

  1. 有一個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運行時環境(版本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實現可能會有所不同,但這似乎不太可能。

您是否從管理員的命令提示符運行命令? 如果沒有,我會嘗試(啟動命令提示符時,右鍵單擊並選擇以管理員身份運行)。

Windows Vista和7添加了一項名為UAC的功能,這意味着即使您是管理員,您的帳戶也不會獲得管理員權限。 此效果可能會影響程序或Java程序或Java虛擬機可用的權限。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM