java - 为什么 Java 创建的两个子进程表现不同?

标签 java c++ jvm persistence subprocess

我使用 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。 (不确定它们是否重要~)

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

百合花

最佳答案

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

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

关于java - 为什么 Java 创建的两个子进程表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2678423/

相关文章:

java - 找出进程的 PID 以及它在 Java/JVM 中使用了多少内存?

ubuntu - 如何将Java Hotspot Server VM设置为客户端模式?

java - JVMTI _jclass toString

java - 当存在某些类时,Eclipse Luna 内容帮助不起作用

c++ - 函数调用不起作用, vector 访问数据

c++ - 在 C++ lambda 表达式中按值捕获是否需要使用 lambda 对象复制值?

c++ - 解决命名空间冲突

java - 在CBC模式下使用blowfish进行加解密,但是如何进行IV呢?

java - 当 json 中未设置原语的值时,如何使 Jackson 抛出错误?

java - 如何在android中旋转位图?