Java 通过JNI使用POSIX fork克隆JVM,但子JVM不会退出

Java 通过JNI使用POSIX fork克隆JVM,但子JVM不会退出,java,linux,java-native-interface,fork,Java,Linux,Java Native Interface,Fork,我正在尝试用POSIX fork克隆一个正在运行的JVM。我访问fork的方式是通过JNI(即)。在fork之后,我希望父级和子级都进行一些计算,然后退出 下面是测试代码。在fork之后,我可以看到两行“After the fork.”,意思是父母和孩子都到达了这一点。但是,父进程正常退出,而子进程不正常退出 此外,我不能用终端中的信号15终止子进程。我必须使用kill-9来终止子JVM进程 你知道什么地方出了问题吗 import static com.sun.akuma.CLibrary.LI

我正在尝试用POSIX fork克隆一个正在运行的JVM。我访问fork的方式是通过JNI(即)。在fork之后,我希望父级和子级都进行一些计算,然后退出

下面是测试代码。在fork之后,我可以看到两行“After the fork.”,意思是父母和孩子都到达了这一点。但是,父进程正常退出,而子进程不正常退出

此外,我不能用终端中的信号15终止子进程。我必须使用kill-9来终止子JVM进程

你知道什么地方出了问题吗

import static com.sun.akuma.CLibrary.LIBC;

public class ForkTest {
    public static void main(String[] args) {
        int pid = LIBC.fork();
        if (pid == 0) {
            System.out.println("This is the child.");
        } else {
            System.out.println("This is the parent. child pid=" + pid);
        }
        System.out.println("After the fork.");
    }
}
@唤醒
根据本文,当您分叉多线程应用程序时,只有名为fork()的线程保持活动状态,而其他线程则死亡。如果丢失所有线程,我认为您无法在孩子身上完成快照。

很可能;JVM不是设计成这样使用的,因此它不工作。为什么不使用多线程呢?也许您需要一些工作来捕获或抑制信号-例如SIGCHLD@PeterLawrey线程不适合我想要实现的目标。我基本上希望创建JVM的快照,稍后可能会恢复到此快照。实现这一点的一种干净方法是使用fork。我首先分叉父JVM,让父JVM在此时等待,然后让子JVM继续进行工作。如果稍后,子JVM决定恢复,它只会终止自身,并让父JVM从拍摄快照的点恢复执行。我正在为此编写一个java库,它必须与应用程序无关。所以线不是我想要的。@Ingo谢谢你给我指明了这个方向。请你多解释一下这个问题,如果它工作起来很酷,大多数java开发者都会认为这是个黑客行为。JVM是一个复杂的应用程序,我怀疑使用这种方法会有很多事情不能正常工作,例如,一个fork修改打开的文件或从套接字读取文件。