为什么 Java 创建的两个子进程的行为不同?

Lil*_*ily 5 c++ java persistence jvm subprocess

我使用 JavaRuntime.getRuntime().exec(command)创建一个子进程并打印它,pid如下所示:

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");
}

}
Run Code Online (Sandbox Code Playgroud)

我尝试了 C++ 可执行文件和 Java 可执行文件(.jar 文件)。两个可执行文件都会不断地将“Hello World”打印到标准输出。

cmdC++ 可执行文件出现时,pid会打印到控制台,但子进程一返回就会被终止main()。但是,当我在 中调用 .jar 可执行文件时cmd,子进程不会被终止,这是所需的行为。

我不明白为什么相同的Java代码,不同的可执行文件可以表现得如此不同。我应该如何修改我的代码,以便我可以在 Java 中拥有持久的子进程?

PS:我使用的是 Ubuntu 9.10 和 OpenJDK-1.6。(不知道有没有关系~)

这个领域的新手。欢迎任何建议。

百合

cHa*_*Hao 3

C++ EXE 几乎肯定被标记为控制台应用程序。我认为默认情况下,jar 将被视为 GUI 应用程序,并且会执行标准的与主进程分离的操作。

如果您将 C++ 代码转换为 GUI 应用程序,我想您会看到它的行为与 jar 类似。