2010-04-20 32 views
4

我用Java Runtime.getRuntime().exec(command)創建子進程,並打印其pid如下:爲什麼由Java創建的兩個子進程的行爲有所不同?

public static void main(String[] args) { 

Process p2; 
try {  
    p2 = Runtime.getRuntime().exec(cmd); 
    Field f2 = p2.getClass().getDeclaredField("pid"); 
    f2.setAccessible(true); 
    System.out.println(f2.get(p2)); 
} catch (Exception ie) 
{ 
    System.out.println("Yikes, you are not supposed to be here"); 
} 

} 

我試圖用C++可執行文件和Java可執行文件(.jar文件)。兩個可執行文件都會持續輸出「Hello World」到stdout。

cmd是C++可執行文件時,pid被打印輸出到控制檯,但是隻要main()返回就會終止子進程。但是,當我在cmd中調用.jar可執行文件時,子進程不會被終止,這是所需的行爲。

我不明白爲什麼具有不同可執行文件的相同Java代碼可能表現如此不同。我應該如何修改我的代碼,以便在Java中擁有持久的子進程? PS:我使用Ubuntu 9.10和OpenJDK-1.6。 (不知道他們是否重要〜)

在這個領域的新手。歡迎任何建議。

Lily

回答

2

C++ EXE幾乎肯定被標記爲控制檯應用程序。我想默認情況下,一個jar會被認爲是一個GUI應用程序,並且會執行標準的從主進程中分離出來的東西。

如果您要將C++代碼轉換爲GUI應用程序,我想您會發現它的行爲與jar類似。

+0

我想這不完全是OP期待的答案。你如何輕鬆「將C++代碼轉化爲GUI應用程序」? – recipriversexclusion 2010-04-20 21:15:48

+0

簡單的答案?你沒有。控制檯和Windows子系統是分開的,使用方式不同。 Windows應用程序無法獲得控制檯,因此除非您連接到該過程,否則將永遠無法看到輸出。 – cHao 2010-04-20 21:27:45

+0

不是那麼容易的答案:http://msdn.microsoft.com/en-us/library/ms682055(v=VS.85).aspx – cHao 2010-04-20 21:38:38

相關問題