【问题标题】:Why two subprocesses created by Java behave differently?为什么 Java 创建的两个子进程行为不同?
【发布时间】:2011-02-10 07:52:45
【问题描述】:

我使用Java Runtime.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");
}

}

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

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

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

PS:我使用的是 Ubuntu 9.10 和 OpenJDK-1.6。 (不确定它们是否重要~)

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

百合

【问题讨论】:

    标签: java c++ jvm persistence subprocess


    【解决方案1】:

    C++ EXE 几乎肯定被标记为控制台应用程序。我认为 jar 默认会被视为 GUI 应用程序,并且会执行标准的 detach-from-the-main-process 事情。

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

    【讨论】:

    • 我认为这不是 OP 所期望的答案。如何轻松“将 C++ 代码转换为 GUI 应用程序”?
    • 简单的答案?你没有。控制台和 Windows 子系统是分开的,并且使用方式不同。 Windows 应用程序不会获得控制台,因此除非您附加到进程,否则您将永远看不到输出。
    • 感谢您的回复。但问题是:我不在乎控制台输出。只要main()返回后子进程还在运行,我就已经很开心了~
    猜你喜欢
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 2014-09-11
    相关资源
    最近更新 更多