2010-04-20 54 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

相关问题